これを想像してください。
|-Main_folder
|- Folder1
|- E_1
|- E_1_A
|- file_E_1_A_F_1
|- file2_E_1_A_F_2
|- file3_E_1_A_F_3
|- E_1_B
|- file1_E_1_B_F_1
|- file2_E_1_B_F_2
|- file3_E_1_B_F_3
|- E_2
|- E_2_A
|- file_E_2_A_M_1
|- file2_E_2_A_M_2
|- file3_E_2_A_M_3
|- E_2_B
|- file1_E_2_B_M_1
|- file2_E_2_B_M_2
|- file3_E_2_B_M_3
|- E_3
|...
|- Folder2
特定の名前のファイルを含むこのようなサブディレクトリ構造があります。 UnixやPythonの「F」文字など、サブディレクトリに「F」文字を含むファイルを含む「E_NUMBER」という名前のサブディレクトリとサブディレクトリの数を確認するのに役立ちます。
どんな助けでも歓迎します。ありがとうございます!
ベストアンサー1
GNUユーティリティの使用:
(export LC_ALL=C
find Main_folder -name '*F*' -print0 |
grep -zPo '.*/E_\d+(?=/.*F[^/]*$)' |
sort -z |
uniq -zc |
tr '\0' '\n'
)
このようなファイルMain_folder/Folder1/E_1/whatever/E_2/whatever/xFy
は。E_2
E_1
これにより、zsh
次のことができます。
for dir ( Main_folder/**/E_<->(ND/) ) {
files=( $dir/**/*F*(ND) )
if (( $#files )) print -r "$#files *F* files below $dir"
}
上記の例では、ファイルは合計に含まれていますE_1
。E_2
匿名関数を使用して短縮します。
for dir (Main_folder/**/E_<->(ND/)) () {
if (($#)) print -r "$# *F* files below $dir"
} $dir/**/*F*(ND)
ディレクトリパスのみが必要で、ここに含まれるファイルの数は気にしない場合は、sort -z | uniq -zc
withsort -zu
またはコマンドをprint
withに置き換えます。print -r $dir
F