シンボリックリンクターゲットごとにファイルを一覧表示する


23

シンボリックリンク名ではなく、シンボリックリンクのターゲット名をフィルター処理することにより、ファイルのリストを取得する(およびそのリストで何かを行う)方法 たとえば、次のリストの最初の4つのファイル(ターゲットにはが含まれていますbar)のみに関心があります。

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc

回答:


31

findを使用して、symlinkタイプのすべてのファイルをフェッチし-ilname、リンク先の名前で検索するオプションを追加できます。これ-inameは、リンク名ではなくリンクターゲット名の場合と同じように機能します。

find -type l -ilname "*bar*"

それでも、ターゲットではなくリンクの名前が出力されます。ターゲットの名前を印刷したい場合は、これを試してください:

find -type l -ilname "*bar*" -printf "%l\n"

または、フルlsスタイルの出力を取得します

find -type l -ilname "*bar*" -ls

リストで何かをする」という意味は明確ではありませんが、リンクファイルを操作したい場合は、-exec引数を使用して次を検索できます。

find -type l -ilname "*bar*" -exec touch {} \;

ただし、リンクターゲットを操作する必要がある場合は、-printfを使用してターゲット値を取得し、xargsまたは自分で操作してループする必要があります。次のようなことができます:

find -type l -printf "%l\n" | grep bar | xargs touch

...これは、名前の一致を行うgrep代わりに使用する方法も示しfind -ilnameていますが、どちらにしても可能です。


ありがとうカレブ!あなたは私の直接の質問に完全に答えただけでなく、私も間違いなく使用するいくつかのサイドチャンネルのケースをカバーしました。
マットウィルキー

1
これが機能しない理由find /dev/disk/ -type l -ilname "*sde*"は何ですか?
アクエリアスパワー14

GNU findが必要です。
16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.