各サブディレクトリで3つの一意のファイルを検索し、3つのファイルがすべて存在するときにサブディレクトリを一覧表示するにはどうすればよいですか?次に、最初の7文字に基づいて一意のサブディレクトリを見つけます。

各サブディレクトリで3つの一意のファイルを検索し、3つのファイルがすべて存在するときにサブディレクトリを一覧表示するにはどうすればよいですか?次に、最初の7文字に基づいて一意のサブディレクトリを見つけます。

以下の例のような内容のディレクトリがあります。subdir1, subdir2 & subdir3ファイルを検索したいですtestA/*a.txt, testB/*b.txt & testC/*c.txt。私は3つのサブディレクトリだけを含むリストが欲しいです。

subdir1この例には&のみがありますsubdir2

subdir1/
subdir1/testA/
subdir1/testA/subdir1-a.txt
subdir1/testB/
subdir1/testB/subdir1-b.txt
subdir1/testC/
subdir1/testC/subdir1-c.txt
subdir2/
subdir2/testA
subdir2/testA/subdir2-a.txt
subdir2/testB
subdir2/testB/subdir2-b.txt
subdir2/testC/
subdir2/testC/subdir2-c.txt
subdir3/
subdir3/testA
subdir3/testA/subdir3-a.txt
subdir3/testB
subdir3/testB/subdir3-b.txt
subdir3/testC/
subdir3/testZ
subdir3/testZ/subdir3-z.txt

その後、出力をアルファベット順に取得したいと思います。たとえば、次のようになります。

subdir1
subdir2

...その後、一意の項目のみを取得します。

find(現在使用しており、ディレクトリが順番にリストされていないため、これらの必要性があります。サブディレクトリにも名前が長く複雑です。)

どうすればいいですか?

次のように、filesなどの1種類のファイルを一覧表示しました*-a.txt

find . -wholename "**/testA/*a.txt

答えがすでにどこかに存在する場合は申し訳ありません。探してみましたが見つかりませんでした。どんなアドバイスも本当にありがとうございます。

ベストアンサー1

次のようなものはどうですか?

$ shopt -s nullglob
$ for dir in */; do 
    f1=( "$dir"/testA/*a.txt ) 
    f2=( "$dir"/testB/*b.txt )
    f3=( "$dir"/testC/*c.txt )
    if [[ "${#f1[@]}" -gt 0  && "${#f2[@]}" -gt 0 && "${#f3[@]}" -gt 0 ]]; then 
        printf '%s\n' "$dir" 
    fi
done
subdir1/
subdir2/

まず、bashのオプションをオンにして、nullglobglob拡張と一致するファイルが空の文字列ではないことを確認してください。次に、現在のディレクトリのすべてのサブディレクトリを繰り返し、各サブディレクトリに対して対応するglob拡張結果を配列に保存します。次に、3つの配列すべてに1つ以上の要素がある場合は、サブディレクトリの名前を印刷します。

同じ基本操作を実行することもできますfind

$ for dir in */; do 
    if [[ $(find "$dir" -wholename "*/testA/*a.txt" | wc -l) -gt 0 &&
          $(find "$dir" -wholename "*/testB/*b.txt" | wc -l) -gt 0 &&
          $(find "$dir" -wholename "*/testC/*c.txt" | wc -l) -gt 0 ]]; then 
        printf '%s\n' "$dir" 
    fi
done
subdir1/
subdir2/

おすすめ記事