名前がマスクに一致するファイルまたはファイルへのシンボリックリンクの検索

名前がマスクに一致するファイルまたはファイルへのシンボリックリンクの検索

検索に使用していますsudo find / -name gcc*。複数のディレクトリを返しますが、私はファイルだけを望んでいます。しかし、追加すると、-type f私が望むシンボリックリンクはリストされません。ディレクトリをフィルタリングしてシンボリックリンクを維持する方法は?

また、ワイルドカードを使用してもサポートされていないワイルドカード*というファイルをリストできないことがわかりましたgcc-10findこれを行うことができる他のユーティリティはありますか?

答え1

GNUの実装では、次のことがfindできます。

find / -name 'gcc*' -xtype f

typeシンボリックリンクの確認後にファイルを確認するために使用されます。

再帰グローブを使用すると、zsh次のような効果が得られます。

print -rC1 /**/gcc*(-.)

ここで、glob修飾子はシンボリックリンク確認後に-次の修飾子(ここでは同じ)が適用されるようにします.-type f

可能であれば、すでに構築されているデータベースからファイルを検索するため、通常はより速い方法を代わりにfind使用できます。locate

locate -b0 'gcc*' | find -files0-from - -prune -xtype f

GNU find4.9以降を使用すると、locate名前がaseで始まるすべてのファイルが一覧表示され、bgccfind一般ファイルシンボリックリンクが解決された後。

またはglobと同じですzsh

print -rC1 ${(0)^"$(locate -b0 'gcc*')"}(N-.)

-fPerlは演算子[/をtestテストできるため、これにも役立ちます。定期的なデフォルトでは、シンボリックリンクはファイルとして解決されるため、次のことができます。

locate -b0 'gcc*' | perl -l -0ne 'print if -f'

これにより、ファイルシステム全体をクロールすることなくほぼ即座に結果を得ることができます(ただし、locate最後のデータベース更新以降に追加された一部のファイルは失われる可能性があります)。

答え2

からman find

-type c
   File is of type c:
   [...]
   f      regular file
   [...]
   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シンボリックリンクとファイルを表示するには、パラメータを使用します-type f,l

ワイルドカード関連:findワイルドカードは実際にサポートされています。ただし(-name gcc*代わりに)式を引用しなかったため、-name 'gcc*'シェルは実行前にgcc*このワイルドカード式と一致する現在の作業ディレクトリ内のすべてのファイルに展開されますfind。 (複数のファイルと一致する場合は、find: paths must precede expression呼び出し時にエラーが発生します。これもで説明されていますman。)

したがって、現在の作業ディレクトリに名前が付けられたファイルがある場合、gcc-xyzシェルが実行されますfind -name gcc-xyz

関連情報