すべてのディレクトリにあるすべてのファイルを見つけたいですfoo
。たとえば、次のファイルを考えてみましょう。
foo/w
a/foo/x
a/b/foo/y
a/b/c/foo/z
a/b/c/foo/bar/n
w,x,y,z
このファイルを見つけて、上記のように相対パスで一覧表示したいと思います。私の試みはこれです
$ find . -path '**/foo' -type f
これはうまくいきません。検索にはファイルを含めないでくださいn
。つまり、foo
親ディレクトリ名が関心のあるファイルのみを含める必要があります。
ベストアンサー1
使用されていませんが、find
シェルzsh
ではワイルドカードとして使用されます。
$ printf '%s\n' **/foo/*(^/)
a/b/c/foo/z
a/b/foo/y
a/foo/x
foo/w
これは**
、「再帰的に」ディレクトリを一致させ、foo
現在のディレクトリまたは下のディレクトリで指定されたすべてのディレクトリを一致させ、そのディレクトリ内のすべてのファイルを*(^/)
一致させるglobを使用します。パターンを一致するディレクトリ(通常のファイルのみを一致させるか、通常のファイルへのシンボリックリンクも含む)に制限するglob修飾子で終わりfoo
ます。(^/)
(.)
(-.)
存在するbash
:
shopt -s globstar nullglob
for pathname in **/foo/*; do
if [[ ! -d "$pathname" ]] || [[ -h "$pathname" ]]; then
printf '%s\n' "$pathname"
fi
done
パターンが一致しない場合は、パターンを完全に削除するnullglob
オプションを設定しました。bash
何もない。シェルglobstar
オプションを使用すると、**
inを使用できますbash
(デフォルトでは有効zsh
)。
bash
glob修飾子がないため、zsh
パターンに一致するパス名を繰り返し、各一致をテストして印刷する前にディレクトリではないことを確認します。! -d || -h
テストを「テスト」-f && ! -h
に変更して通常のファイルのみを選択するか、単一のテスト-f
のみを選択して一般ファイルへのシンボリックリンクを印刷します。