web-dev-qa-db-ja.com

ディレクトリックリック内のすべてのシンボリックリンクを見つけ出す方法を教えてください。

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

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

find /var/www/ -type l

…そして後で私は/var/wwwの内容がシンボリックリンクであることを発見したので、私はコマンドを次のように変更しました:

find -L /var/www/ -type l

実行にはしばらく時間がかかりますが、何も一致しません。

これでサブディレクトリをチェックできますか?

209
hafichuk

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

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

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

   -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
267
ztank1013

1コマンド、パイプなし

find . -type l -ls

説明:現行ディレクトリーからのfind.は、-type linkのすべての参照を前方に進め、それらの-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/

188

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]$ 
9
jman

シンボリックリンクそのものを見るためには、

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

ターゲットとなるファイルも確認したい場合は、lsを追加してください。

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

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

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...
4
siliconrockstar

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

lsl ls -lRを作成できます。 grep ^ l

+ xをchmodするだけでいいのです。

0
Alex M