現在のディレクトリですべてのソフトリンク(シンボリックリンク)を見つける方法は?


10

質問は、のシェルスクリプトに関連していますbash

現在のディレクトリ内のどのファイルがソフトリンクであるかをスクリプト確認する方法は?

間違った用語を使用した場合、ソフトリンクとは、を使用して作成されたファイルを指しますln -s

私がどうにか考えたのはls -la、式として評価してその結果を解析することだけですが、明らかにこれが最良の解決策ではありません。


1
それらは「ハードリンク」ではなく「シンボリックリンク」と呼ばれます。
追って通知があるまで一時停止。

Righto、私はおそらく用語が間違っていることを知っていました、頭を上げてくれてありがとう
bguiz 2009年

ソフトリンクも問題ありませんが、スペースがあります。:
Arjan

回答:



14

本当にスクリプトは必要ないかもしれません。子フォルダーに再帰せずに、現在のフォルダーのみのシンボリックリンクを表示するには:

見つける。-maxdepth 1 -type l -print

または、さらに情報を取得するには、次のいずれかを使用します。

見つける。-maxdepth 1 -type l -exec ls -ld {} +
見つける。-maxdepth 1 -type l -print0 | xargs -0 ls -ld

言うとあれば、ファイルがシンボリックリンクである、1を使用することができreadlink、その意志の出力は何もそれがシンボリックリンクではない場合。次の例はあまり役に立ちませんが、readlink通常のファイルとフォルダを無視する方法を示しています。次のいずれかを使用します。

見つける。-maxdepth 1 -exec readlink {} +
見つける。-maxdepth 1 -print0 | xargs -0 readlink

上記の-exec ... +xargs ...よりもはるかに高速であることに注意してください-exec ... \;。お気に入り:

time find / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
実数0分0.372秒
ユーザー0m0.087s
sys 0m0.163s

time find / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
実数0分0.013秒
ユーザー0m0.004s
sys 0m0.008s

time find / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
実数0m0.012s
ユーザー0m0.004s
sys 0m0.009s

私はいつかシェルスクリプトの外でそれをする必要があるかもしれないので、私はあなたのために+1するPolsyの答えがより好きでした。
bguiz 2009年

1
xargsは必ずしも必要ではありません。あなたはただfindを使うことができます。-maxdepth 1 -exec readlink {} \;
stib

確かに、@ stibですが、私のMacの方xargsはるかに高速です。私の編集を参照してください。しかし、私は今日新しいことを学びました。+代わりに\;これにgrep。に問題がある/あると主張する人もいますが)
Arjan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.