하나 이상의 *.flac 파일을 반복적으로 검색합니다. 동일한 디렉터리에 *.cue 파일이 없으면 디렉터리 이름을 인쇄합니다.

하나 이상의 *.flac 파일을 반복적으로 검색합니다. 동일한 디렉터리에 *.cue 파일이 없으면 디렉터리 이름을 인쇄합니다.

하나 이상의 파일이 포함된 폴더를 검색하는 데 도움이 필요하지만, 동일한 폴더에 파일이 없으면 *.flac폴더 이름을 인쇄하세요.*.cue

이에 대해 작동하는 echo, find, grep, ls, perl, 스크립트 명령 등이 있습니까?

macOS 터미널에서 zsh를 사용하고 있습니다... 감사합니다!

답변1

zsh glob만 사용하면 쉽게 이 작업을 수행할 수 있습니다.

has() ()(($#)) $REPLY/?*.$1(NDY1)
print -rC1 -- **/*(NDFe['has flac && ! has cue'])

D숨겨진 파일/디렉토리를 무시하려면 s를 제거하십시오. 그런 다음 ?이름이 지정된 숨겨진 파일이 .flac루트 이름이 비어 있는 flac 파일이 아니라 확장명이 없는 숨겨진 파일로 처리 되도록 하기 위해 사용한 flac 파일을 제거할 수도 있습니다 .

예를 들어 참조하십시오.zsh의 특정 파일 및 파일 유형 존재에 대한 조건부 테스트여기에서 사용된 건축 유형에 대한 자세한 내용을 확인하세요.

이를 다음과 같이 확장할 수 있습니다.

has_at_least() ()(($# >= $1)) $REPLY/?*.$2(NDY$1)
print -rC1 -- **/*(NDFe['has_at_least 3 flac && ! has_at_least 1 cue'])

파일이 3개 이상 있고 파일이 flac없는 디렉터리의 경우 cue.

또는:

has_from_to() ()(($# >= $1 && $# <= $2)) $REPLY/?*.$3(ND)
print -rC1 -- **/*(NDFe['has_from_to 1 inf flac && has_from_to 0 0 cue'])

또는 실제로 다음과 같은 것을 좋아하고 수행합니다.

has() {
  local -A minmax=("$@") count
  local file ext n=${#minmax}
  for file ($REPLY/?*.*(ND)) (( ++count[\$file:e] ))
  for ext ("${(k@)minmax}")
    (( count[\$ext] >= ${minmax[$ext]%-*} &&
       count[\$ext] <= ${minmax[$ext]#*-} &&
       n-- ))
  (( n == 0 ))
}

print -rC1 -- **/*(NDFe['has flac 1-inf txt 2-6 cue 0-0'])

최소 1 flac초, 2~6 txt초 및 없음이 포함된 디렉터리의 경우cue

관련 정보