私のシステムには壊れたリンクがたくさんあります。壊れたリンクをすべて再接続するスクリプトを作成しました。ただし、スクリプトの実行後にfindを再実行すると、リンクがまだ存在することがわかります。
これは私のコードです。
find /home/saman -lname '/home/saman/*' -exec \
sh -c 'ln -snf "/home$(readlink "$0")" "$0"' {} \;
上記のコマンドを実行した後、壊れたリンクを検索しましたが、まだ見つかりました。
find . -type l | xargs file | grep broken
私は何が間違っていましたか?
答え1
最初の問題は、find
コマンドが相対パスではなくフルパスを使用してリンクのみを見つけることです。表示するには:
$ ln -s /home/terdon/foo/NonExistantFile foo
$ ln -s NonExistantFile bar
$ tree
.
|-- bar -> NonExistantFile
`-- foo -> /home/terdon/foo/NonExistantFile
上記の例では、2つの壊れたリンクを作成しました。 1つ目は絶対パスを使用し、2つ目は相対パスを使用します。find
今、あなたのコマンドを試してみると(echo
何が起こっているのかを確認するために実行するのではなく、relinkコマンドを使用して)、次の2つのうちの1つだけが見つかります。
$ find . -lname '/home/terdon/*' -exec \
sh -c 'echo ln -snf "/home$(readlink "$0")" "$0"' {} \;
ln -snf /home/home/terdon/foo/NonExistantFile ./foo
2番目の問題は、パスが間違っていることです。リンクをとして再生成しています"/home$(readlink "$0")" "$0"
。readlink
コマンドはすでにフルパスを表示しているため、リンクを追加しても目的の/home
結果は表示されません。/home/home/...
さらに重要なことは、あなたが試すことが不可能であるということです。リンクが切断された場合、宛先が存在しないことを意味します。ターゲットが存在せず、リンクする場所がないため、単にファイルを再リンクすることはできません。到着。あなたができる唯一のことは、リンクのターゲットを再作成することです。しかし、これは壊れたリンクが新しい空のファイルを指すようにするので、あまり役に立ちません。これが本当にあなたがやりたいことなら試してみることができます。
find . -type l -exec sh -c 'touch "$(readlink "{}")" ' \;
最後に、i) 壊れたリンクをすべて探し、ii) コンピュータ上でリンク先と同じ名前のファイルを検索し、iii) そのリストを提供し、iv) 何かを尋ねるより複雑なスクリプトを作成することができます.今接続する必要があります。
答え2
私のシステムには壊れたリンクがたくさんあります。壊れたリンクをすべて再接続するスクリプトを作成しました。ただし、スクリプトの実行後にfindを再実行すると、リンクがまだ存在することがわかります。
GNU Linuxシステムのこの行は興味深いかもしれません。私はそれが@Gilesから来たと思いますが、今は参照が見つかりません。
find -xtype l -delete
壊れたソフトリンクを再帰的に見つけて削除します。