문자열에 이름이 같은 문자가 있는 파일의 하위 디렉터리를 나열하고 계산합니다.

문자열에 이름이 같은 문자가 있는 파일의 하위 디렉터리를 나열하고 계산합니다.

이것을 상상해 보세요:

 |-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_2E_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 -zcwith sort -zu또는 명령을 printwith로 바꾸십시오.print -r $dirF

답변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입니다 . 출력이 순서대로 되지 않으면 .echouniqfindsortuniq

관련 정보