以下の例のような内容のディレクトリがあります。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のオプションをオンにして、nullglob
glob拡張と一致するファイルが空の文字列ではないことを確認してください。次に、現在のディレクトリのすべてのサブディレクトリを繰り返し、各サブディレクトリに対して対応する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/