ディレクトリ内のファイル名を繰り返し検索し、見つかった場合は降順で停止します。

ディレクトリ内のファイル名を繰り返し検索し、見つかった場合は降順で停止します。

同じ名前のファイルを含むディレクトリツリーがあります。たとえば、次のようになります。

a/file
a/...
a/b/file
x/a/file
x/a/...
x/b/file

私はツリーを再帰的に検索するときに最初に来るすべてのパスを取得するためにfind(with-execと)を使用しようとしています。私の例は次を返します。-prunefile

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-pruneprintf何らかの理由で失敗しても、対応する作業を行うことが保証されます。

  • このソリューションではfind何も処理されませんfile。ディレクトリのみが処理されます。で何かをしたい場合は、file内部シェルからにすることができます$f

    例:を使用すると、… -prune -printツールはファイルではなく関連するディレクトリパス名を印刷します。内部シェルが使用するfileパスを印刷します。printf

おすすめ記事