同じ名前のファイルを含むディレクトリツリーがあります。たとえば、次のようになります。
a/file
a/...
a/b/file
x/a/file
x/a/...
x/b/file
私はツリーを再帰的に検索するときに最初に来るすべてのパスを取得するためにfind
(with-exec
と)を使用しようとしています。私の例は次を返します。-prune
file
a/file
x/a/file
x/b/file
a/b/file
呼び出されるファイルがすでに存在してfile
いるため返されませんa/
。
Bashを使用してこれを達成するにはどうすればよいですか?
ベストアンサー1
find . -type d -exec sh -c '
f="$1"/file
[ -e "$f" ] && { printf "%s\n" "$f"; true; }
' find-sh {} \; -prune
file
ファイルを探す代わりに、ディレクトリを探して各ディレクトリに存在するかどうかをテストしました。file
存在する場合は、そのパスを印刷し、-prune
そのディレクトリに対して有効にします。
メモ:
true
-prune
printf
何らかの理由で失敗しても、対応する作業を行うことが保証されます。このソリューションでは
find
何も処理されませんfile
。ディレクトリのみが処理されます。で何かをしたい場合は、file
内部シェルからにすることができます$f
。例:を使用すると、
… -prune -print
ツールはファイルではなく関連するディレクトリパス名を印刷します。内部シェルが使用するfile
パスを印刷します。printf