特定のファイルを含むすべてのディレクトリのリストを使用するbashスクリプトを書きたいのですが。 find
を使用して、一致するすべてのファイルのパスをエコーできます。少なくとも1つの一致するファイルを含むディレクトリへのパスを一覧表示したいだけです。
たとえば、次のディレクトリ構造があるとします。
dir1/
matches1
matches2
dir2/
no-match
コマンド('matches*'
を探す)は、dir1
へのパスのみを出力します。
追加の背景として、Java .classファイルを含む各ディレクトリを見つけるためにこれを使用しています。
find -name '*.class' -printf '%h\n' | sort -u
man find
から:
-printf
形式
%h
ファイル名の先頭ディレクトリ(最後の要素を除くすべて)。ファイル名にスラッシュが含まれていない場合(現在のディレクトリにあるため)、%h
指定子は"."
に展開されます。
OS XおよびFreeBSDで、find
それ -printf
オプション 、これは動作します:
find . -name *.class -print0 | xargs -0 -n1 dirname | sort --unique
-n1
in xargs
は、dirname
の呼び出しごとに標準入力から取得される引数の最大数を1に設定します
GNU find
find /root_path -type f -iname "*.class" -printf "%h\n" | sort -u
わかりました。遅すぎますが、「ファイルをBashと一致させる」(または少なくともPOSIXシェル)に具体的に回答することもできます。
ls */*.class | while read; do
echo ${REPLY%/*}
done | sort -u
${VARNAME%/*}
は、最後の/
以降のすべてを削除します(最初の後にすべて削除したい場合は、${VARNAME%%/*}
になります)。
よろしく。
find / -name *.class -printf '%h\n' | sort --unique
遅すぎますが、これは将来の読者にとって役立つかもしれません。個人的には、ターミナル(Mac)ではなく、フォルダのリストをファイルに出力する方が便利だと思います。そのためには、単純にファイルへのパスを出力できます。 folder.txt、以下を使用:
find . -name *.sql -print0 | xargs -0 -n1 dirname | sort --unique > folders.txt