폴더의 최신 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])
그러나 일치하는 파일이 너무 많으면 셸 제한 사항에 부딪힐 수 있으며, 이 경우 xargs
ZSH가 필요할 수 있습니다.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