이것을 상상해 보세요:
|-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
with sort -zu
또는 명령을 print
with로 바꾸십시오.print -r $dir
F
답변2
"유닉스에서"라는 말이 무슨 뜻인지 잘 모르겠습니다. 가장 가까운 쉘이 작동하면 bash
시도해보십시오.
readarray -t FN <<< $(find .)
for i in "${FN[@]}"
do if [[ "${i%/*}" =~ E_[[:digit:]] && "${i##*/}" =~ F ]]
then echo "${i%/*}"
fi
done | uniq -c
3 ./E_1/E_1_A
3 ./E_1/E_1_B
for
루프가 파일/디렉터리 이름(예: 공백)을 차단하지 않도록 디렉터리 트리를 배열로 읽어옵니다 (단, 개행에는 도움이 되지 않음). E_[[:digit:]]
해당 파일 이름이 일치하는 경로(정규 표현식으로 변환된 "E_NUMBER" )에 포함된 경우 명령에 의해 계산되는 경로 이름 F
입니다 . 출력이 순서대로 되지 않으면 .echo
uniq
find
sort
uniq