모든 파일을 삭제하고 각 하위 디렉터리(특정 디렉터리에서 시작)의 최신 파일만 유지하는 방법에 대한 제안 사항이 있습니까? 내가 시도한 것은 다음과 같습니다.
#!/bin/bash
find /home/ftp/ -type f | while IFS= read -r line
do
find "$line" -type f | head -n -1 | while read file
do
#rm -f "$file"
echo "$file"
done
done
/home/ftp/upload 및 /home/ftp/download에 2개의 하위 디렉터리가 있습니다. 두 개의 하위 디렉터리에는 각각 2개의 파일이 있습니다.
위 스크립트를 테스트할 때 파일 이름이 에코되지 않습니다.
답변1
zsh
현재 디렉토리에서 를 사용하십시오 .
for dir (**/*(N/)) {
files=($dir/*(N.om))
(($#files > 1)) && echo rm -f -- $files[2,-1]
}
숨겨진 디렉터리와 파일을 고려하려면 D
glob 한정자를 추가하세요.
그럼 그냥 고려해봐정기적인문서. 장치, 소켓, 명명된 파이프와 같은 다른 유형의 파일을 원하거나 기호 링크를 따르려는 경우 더 많은 glob 한정자를 사용하여 조정할 수 있습니다.
echo
실제로 작업을 수행하려면 제거하세요 .
최신 GNU 도구와 POSIX 셸을 사용하세요.
(export LC_ALL=C
find . -type f -printf '%T@\t%p\0' |
sort -rzn |
cut -zf2- |
gawk -v RS='\0' -v ORS='\0' '
match($0,/.*\//) && n[substr($0,1,RLENGTH-1)]++' |
xargs -r0 echo rm -f
)