ディレクトリ外のファイルへの相対シンボリックリンクを含むディレクトリを移動するための良いコマンドは何ですか?

ディレクトリ外のファイルへの相対シンボリックリンクを含むディレクトリを移動するための良いコマンドは何ですか?

私は可能なときはいつでも相対シンボリックリンクを使用するのが好きです。なぜなら、私のファイルシステムがルートではなく場所にマウントされている場合でも同様です。リモートアクセス

ただし、相対シンボリックリンクを含むディレクトリを移動すると、通常、これらのリンクは無効になります。

ディレクトリ全体(ツリー)を移動するために使用できるコマンドを探しています。ディレクトリの外側を指す相対シンボリックリンクのみを再作成して、同じファイルを指すようにします。

Stack Overflowについて質問があります。相対シンボリックリンクを移動するには?。また、UnixとLinuxではツリーの外側を指すディレクトリツリー内のすべてのシンボリックリンクを検索する、および(より難しい問題に言及)ターゲットファイルを移動または名前変更するための一種のシンボリックリンクサポートはありますか?

たとえば、mv-rel次のように動作するコマンドがあります(他のコマンドはGNU coreutilsのバージョンです)。

$ mkdir foo
$ touch bar
$ ln -sr bar foo/
$ touch foo/flob
$ ln -sr foo/flob foo/qux
$ ls -gG foo/
total 0
lrwxrwxrwx 1 6 Dec  1 00:05 bar -> ../bar
-rw-r--r-- 1 0 Dec  1 00:24 flob
lrwxrwxrwx 1 4 Dec  1 00:24 qux -> flob

$ mkdir baz
$ mv-rel foo/ baz
$ ls -gG baz/foo/
total 0
lrwxrwxrwx 1 6 Dec  1 00:05 bar -> ../../bar
-rw-r--r-- 1 0 Dec  1 00:24 flob
lrwxrwxrwx 1 4 Dec  1 00:24 qux -> flob

何か欠落していない場合は、これは "mv"コマンド(および "cp"も可能)のための便利なコマンドラインオプションのようです。しかし、この質問の目的のために、私は現在存在するもの、またはこの機能を実装する簡単な移植可能なスクリプトを探しています。

ベストアンサー1

最後に解決策を書いてGithubに投稿しました。

https://github.com/minTaqa/mvrel

2つの引数のみが許可され、2番目の引数はディレクトリである必要があるため、現在「mv」ほど柔軟ではありません。しかし、相対的なシンボリックリンクが多くのコンテンツを移動するのに役立つと思います。私はファイル名の空白、改行、および他の空白を処理できるかどうかを確認したかったので、Bashで書かれたTAP互換テストフレームワークであるBatsについて学び、その中で単体テストを実行する機会でもありました。すべてが大丈夫だということです。

スクリプト自体もBashで書かれています。私はこれがこの作業のための最も簡単で移植性の高い言語だと思いましたが、最終的に次の問題を解決する必要がありました。コマンド置換は末尾の改行を削除します。(ファイル名の後に改行文字がある場合は問題になります。これはほとんど理論的ですが、まだ迷惑です)。find ... -print0ありIFS= read -rd ''、および多くの引用符と "--"パラメータ - これらはPerlなどの低レベルのスクリプト言語では必要ありません。私もしません。パラメータ拡張による文字列操作パールから。とにかく、必要に応じてPerlまたはCで書き換えることもできますが、実際にはBashではかなり短いです。

おすすめ記事