webdevqa.jp.net

Bashで一致するファイルを含むディレクトリをエコーする方法は?

特定のファイルを含むすべてのディレクトリのリストを使用するbashスクリプトを書きたいのですが。 findを使用して、一致するすべてのファイルのパスをエコーできます。少なくとも1つの一致するファイルを含むディレクトリへのパスを一覧表示したいだけです。

たとえば、次のディレクトリ構造があるとします。

dir1/
    matches1
    matches2
dir2/
    no-match

コマンド('matches*'を探す)は、dir1へのパスのみを出力します。

追加の背景として、Java .classファイルを含む各ディレクトリを見つけるためにこれを使用しています。

34
Grundlefleck
find -name '*.class' -printf '%h\n' | sort -u

man findから:

-printf形式

%hファイル名の先頭ディレクトリ(最後の要素を除くすべて)。ファイル名にスラッシュが含まれていない場合(現在のディレクトリにあるため)、%h指定子は"."に展開されます。

60
John Kugelman

OS XおよびFreeBSDで、findそれ -printfオプション 、これは動作します:

find . -name *.class -print0 | xargs -0 -n1 dirname | sort --unique

-n1 in xargsは、dirnameの呼び出しごとに標準入力から取得される引数の最大数を1に設定します

29
xverges

GNU find

find /root_path -type f -iname "*.class" -printf "%h\n" | sort -u
7
ghostdog74

わかりました。遅すぎますが、「ファイルをBashと一致させる」(または少なくともPOSIXシェル)に具体的に回答することもできます。

ls */*.class | while read; do
  echo ${REPLY%/*}
done | sort -u

${VARNAME%/*}は、最後の/以降のすべてを削除します(最初の後にすべて削除したい場合は、${VARNAME%%/*}になります)。

よろしく。

3
bufh
find / -name *.class -printf '%h\n' | sort --unique
1
Jim

遅すぎますが、これは将来の読者にとって役立つかもしれません。個人的には、ターミナル(Mac)ではなく、フォルダのリストをファイルに出力する方が便利だと思います。そのためには、単純にファイルへのパスを出力できます。 folder.txt、以下を使用:

find . -name *.sql -print0 | xargs -0 -n1 dirname | sort --unique > folders.txt

1
davidqshull