ディレクトリツリーですべてのシンボリックリンクを見つけるにはどうすればよいですか?


254

私は私のウェブサイトのディレクトリツリー内のすべてのシンボリックリンクを見つけようとしています。findこれを行うために使用できることは知っていますが、ディレクトリを再帰的にチェックする方法がわかりません。

私はこのコマンドを試しました:

find /var/www/ -type l

…その後、のコンテンツ/var/wwwがシンボリックリンクであることを発見したので、コマンドを次のように変更しました。

find -L /var/www/ -type l

実行には少し時間がかかりますが、一致しません。

これを取得してサブディレクトリを確認するにはどうすればよいですか?

回答:


300

これは/path/to/folderディレクトリを再帰的に走査し、シンボリックリンクのみをリストします:

ls -lR /path/to/folder | grep ^l

シンボリックリンクもたどる場合は、findコマンドを使用する必要があり-Lますが、オプションを含める必要があります。実際、findmanページには次のように書かれています:

   -L     Follow symbolic links.  When find examines or prints information
          about files, the information used shall be taken from the  prop‐
          erties  of  the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to
          examine  the file to which the link points).  Use of this option
          implies -noleaf.  If you later use the -P option,  -noleaf  will
          still  be  in  effect.   If -L is in effect and find discovers a
          symbolic link to a subdirectory during its search, the subdirec‐
          tory pointed to by the symbolic link will be searched.

          When the -L option is in effect, the -type predicate will always
          match against the type of the file that a symbolic  link  points
          to rather than the link itself (unless the symbolic link is bro‐
          ken).  Using -L causes the -lname and -ilname predicates  always
          to return false.

次にこれを試してください:

find -L /var/www/ -type l

これはおそらく機能します:私はfindこのダイヤモンドをmanページで見つけました:-typeオプションを使用している場合は、オプションに変更する必要があり-xtypeます:

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

次に:

find -L /var/www/ -xtype l

1
おかげで、これはおそらくうまくいくでしょうが、私は/ var / www /の内容がすでにシンボリックリンクであり、これがそれらのディレクトリに再帰しないように気付いただけです。
hafichuk 2011

4
@hafichuk私の回答の最終編集を参照してください(find -L /var/www/ -xtype l)。の-xtype代わりにを使用すると-type、検索でトリックが実行されます。幸運を!
ztank1013

3
ls -laR /path/to/folder | grep ^l「非表示」のドットフォルダーも処理する場合は、これを作成します...
wimvds

2
ありがとうございました!しかし、これはリンクの名前だけを示し、それらの場所は示しません。
コスタノス2014年

8
Mac OSX(10.9)では-xtype使用できません。find . -type l再帰的にチェックしているようです。
amertkara 2014年

227

1つのコマンド、パイプなし

find . -type l -ls

説明: find現在のディレクトリ.から、-type lインクのすべての参照と-ls詳細をリストします。簡潔でシンプル...

この答えを拡張して、シンボリックリンクに関連するfindコマンドをいくつか示します。

特定のターゲットへのシンボリックリンクを見つける

find . -lname link_target

link_targetはワイルドカード文字を含む可能性のあるパターンであることに注意してください。

壊れたシンボリックリンクを見つける

find -L . -type l -ls

この-Lオプションfindは、壊れていない限り、シンボリックリンクをたどるように指示します。

壊れたシンボリックリンクを見つけて置き換える

find -L . -type l -delete -exec ln -s new_target {} \;

もっと見つける例

その他のfind例は、https//hamwaves.com/find/にあります。


7
より簡潔にしたい場合は、のほとんどのバージョンにオプションがあることを言及する価値findがあり-lsます。したがってfind . -type l -ls、上記と同等である必要があります。
Bratchley 2014

7
これは、シンボリックリンクがディレクトリツリーのどこにあるかを通知するため、受け入れられた回答を改善します。シンボリックリンクが含まれている可能性が高い種類の複雑で深いツリーを操作する場合は特に重要です。
Jesse Crossen、2014年

2
質問がより良い回答として受け入れられた方がよい。
Lord_Dracon

3
この回答は、承認された回答よりもはるかに役立ちます。また、あるディレクトリのファイルを指すシンボリックリンクを見つけたい場合は、次のようにしますfind -lname '*/dir/*' -printf '%P -> %l\n'。link_targetはパターンであることに言及する価値があります。
x-yuri 2018

1
これが私の答えです。簡潔でシンプル。ありがとう。
真理調整者

11

find デフォルトですでに再帰的に見えます:

[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$ 

これはおそらくこれらの落とし穴の1つであり、/ var / www内のすべてのファイルシンボリックリンクです。findデフォルトでは、これらを再帰的に?私はそうは思いません;)
hafichuk

うん、おそらくループを避けるために。
jman

-Lフラグを使用して、運がなくても検索できるように更新しました-推測ですか?
hafichuk 2011

完璧なソリューション、そしてそれはリンクの場所を示しています。ありがとうございました!
コスタノス2014年

8

シンボリックリンク自体だけを表示するには、次を使用できます

find -L /path/to/dir/ -xtype l 

ターゲットとするファイルも確認したい場合は、lsを追加します

find -L /path/to/dir/ -xtype l -exec ls -al {} \;

6

これは私がこれまでに見つけた中で最高のものです。現在のディレクトリにあるシンボリックリンクを再帰的に表示しますが、それらをたどることなく、フルパスやその他の情報とともに表示します。

find ./ -type l -print0 | xargs -0 ls -plah

出力は次のようになります。

lrwxrwxrwx 1 apache develop 99 Dec  5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...

0

私が行うことは、エイリアスのようなスクリプトをbinディレクトリに作成することです。たとえば、lsd ls -lという名前のスクリプトがあります。grep ^ d

1つのlsl ls -lR | グレップ^ l

それらに+ xをchmodするだけでよい。

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