하위 디렉터리에서 ZSH glob 명령을 재귀적으로 실행하는 방법

하위 디렉터리에서 ZSH glob 명령을 재귀적으로 실행하는 방법

폴더의 최신 10개 디렉터리를 제외한 모든 디렉터리를 삭제하는 ZSH glob 명령이 있습니다.

#! /bin/zsh
cd /path/to/backups/pod1 && rm -rf ./*(Om[1,-11])

그러나 이는 pod1 디렉터리로 제한됩니다. 동일한 수준에 많은 백업 디렉터리(예: pod1, pod2, pod3 등)가 있습니다. 이상적으로는 다음과 같은 와일드카드를 사용하고 싶습니다.

cd /path/to/backups/* && rm -rf ./*(Om[1,-11])

...위에서 설명한 대로 백업의 하위 디렉터리에서 glob 명령을 실행합니다.

그러나 실행하면 다음과 같은 메시지가 나타납니다.

cd: too many arguments

그래서 나는 무엇을 해야할지 잘 모르겠습니다.

답변1

cd하나의 매개변수만 허용됩니다. 한 가지 방법은 cd각 디렉토리로 이동하는 것입니다(필수는 아니지만 서브쉘을 사용함).만약에이러한 디렉터리는 정규화된 디렉터리입니다(즉, 디렉터리가 상대적이지 않음).

for d in /path/to/backups/*; do
  ( cd $d && rm -rf ./*(om[1,-11]) )
done

대안은 파일을 직접 삭제하는 것입니다(여기서 디버그하여 print올바른 파일이 일치하는지 먼저 확인하십시오). 표현식에 여러 glob을 지정할 수 있기 때문입니다. 이는 총 10개의 파일을 유지하는 반면, 루프 기반 솔루션은 각 디렉터리에 10개의 파일을 유지합니다.

print -l /path/to/backups/pod*/*(Om[1,-11])

그러나 일치하는 파일이 너무 많으면 셸 제한 사항에 부딪힐 수 있으며, 이 경우 xargsZSH가 필요할 수 있습니다.zargs

답변2

이것이 도움이 될지는 모르겠지만 - 이 질문은 약간 오래되었기 때문에 - 최소한 미래의 독자들에게 도움이 될 수 있기를 바랍니다.

이 명령은 (실제 명령의 이름은 find입니다.) 각 파일 끝에는 * 와일드카드 [점] 확장자가 있습니다.

find . -name <*.Extension> -type f -exec < command > {} \;

어디:

  • .또는 - 현재 디렉토리를 표시하고 ./다음과 같은 것을 /home/you/Folders/Files/사용하십시오 .주어진 명령Files/ 폴더 아래에 있는 파일만 해당됩니다. 와, <와일드카드 확장>.
  • <*.확장자>*.dll또는와 같은 파일 와일드카드 확장자입니다.*.doc
  • <command>md5sum지정된 .Extension을 가진 각 파일의 md5 체크섬을 계산하는 등 발견된 모든 파일에 대해 실행되는 명령입니다 .

예시 1:

다음으로 끝나는 각 파일에 대해 head -n 50명령을 실행합니다.| sha256sum

.F0확장명을 지정하고 출력을 파일에 저장합니다 Result.out.

find . -name *.F0 -type f -exec head -n 50 {} \; | sha256sum >> Result.out

예 2:

위와 동일하지만 환경 변수를 사용합니다.

EXT="*.F0"

CMD="head -n 50"

find . -name $EXT -type f -exec $CMD {} \; | sha256sum >> Result.out

관련 정보