fooというディレクトリにあるすべてのファイルを探します。

fooというディレクトリにあるすべてのファイルを探します。

すべてのディレクトリにあるすべてのファイルを見つけたいです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)。

bashglob修飾子がないため、zshパターンに一致するパス名を繰り返し、各一致をテストして印刷する前にディレクトリではないことを確認します。! -d || -hテストを「テスト」-f && ! -hに変更して通常のファイルのみを選択するか、単一のテスト-fのみを選択して一般ファイルへのシンボリックリンクを印刷します。

おすすめ記事