シンボリックリンクをハードリンクに変換する


25

ディレクトリ内のソフトリンクをハードリンクに再帰的に変換したいと思います。私はこのようなことを試しました:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

…しかし、2つの大きな問題があります。

  • 再帰的ではない
  • シンボリックリンクではないファイルをピックアップします

どういうわけか上記の行をに送るのはいいことですがfind -type l、どうすればいいのかわかりません。


1
[このディスカッション] [1](cp -aH)も参照してください。[1]:unix.stackexchange.com/questions/94185/…–
マイケル

回答:


34

このコマンドは機能するはずです:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

使い方:

  • find -type l 現在のディレクトリ内のすべてのリンクを検索します。

  • -exec bash -c '...' {} \;bashを呼び出して実行し...ます。

    これ{}は、現在処理中のリンクの名前を引数として渡します。bashはとしてアクセスできます$0

  • readlink -m "$0" シンボリックリンクのリンク先の絶対パスを返します。

  • ln -f "$(readlink -m "$0")" "$0"ターゲットへのハードリンクで-fシンボリックリンク$0を上書きします()。

何らかの理由でリンクを変換できない場合、リンクはそのまま残り、lnはエラーメッセージを出力します。


その最後の段落に関しては、それはへの絶対パスを指定するには十分ではないbashln
ダニエルベック

2
私の問題は、readlinkがデフォルトで相対パスを返すことでしたが、-eスイッチはそれを修正します。
デニス

OSXのコマンドは何ですか?
イゴールマルケロフ

@IgorMarkelovすみませんが、OSXに関してはわかりません。
デニス

1
Macでは、それは次のようになりますbrew install coreutilsfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
イゴール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.