検索に使用していますsudo find / -name gcc*
。複数のディレクトリを返しますが、私はファイルだけを望んでいます。しかし、追加すると、-type f
私が望むシンボリックリンクはリストされません。ディレクトリをフィルタリングしてシンボリックリンクを維持する方法は?
また、ワイルドカードを使用してもサポートされていないワイルドカード*
というファイルをリストできないことがわかりましたgcc-10
。find
これを行うことができる他のユーティリティはありますか?
答え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 find
4.9以降を使用すると、locate
名前がaseで始まるすべてのファイルが一覧表示され、b
gcc
find
一般ファイルシンボリックリンクが解決された後。
またはglobと同じですzsh
。
print -rC1 ${(0)^"$(locate -b0 'gcc*')"}(N-.)
-f
Perlは演算子[
/を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
。