폴더의 오래된 파일을 삭제하는 bash 스크립트를 만들고 싶습니다. 스크립트를 실행할 때마다 오래된 파일 하나만 삭제됩니다. 이 문제를 해결하는 데 도움을 주실 수 있나요? 감사해요
답변1
Coase가 지적했듯이 (생성 날짜 측면에서) 가장 오래된 파일을 아는 것이 불가능할 수 있습니다.
수정 시간이 적절하고 파일 이름에 새 줄이 없는 경우:
rm -- "$(ls -rt | head -n 1)"
(파일 이름을 제어할 수 없는 경우ls 출력을 주의해서 구문 분석하세요.)
숨겨진 파일도 고려할지 여부에 대한 옵션을 추가합니다 -A
.ls
GNU coreutils 9.0부터 GNU에는 NUL로 구분된 파일 이름을 나열하는 옵션이 ls
있으므로 --zero
이러한 최신 버전과 bash 또는 zsh를 셸로 사용하면 모든 파일 이름을 사용할 수 있는 버전은 다음과 같습니다.
IFS= read -rd '' file < <(ls --zero -rt) &&
rm -- "$file"
이러한 최신 버전에는 --time=birth
일부 시스템 및 파일 시스템(대부분의 기본 파일 시스템에 있는 최신 GNU/Linux 시스템 포함)에서 생성 시간을 기준으로 정렬하는 기능도 있습니다.
답변2
가장 오래 수정된 파일은 삭제할 수 있지만 가장 오래 생성된 파일은 삭제할 수 없는 것 같습니다.
사용 가능한 및 유틸리티의 GNU 구현 에 관계없이 stat
이것이 개행 문자가 포함된 파일 이름에서 중단되지 않으므로 가장 안전한 접근 방식이라고 생각합니다.sort
sed
xargs
stat --printf='%Y %n\0' ./* | sort -zn | sed -z 's/[^ ]\{1,\} //;q' | xargs -r0 rm
stat --printf='%.Y %n\0' ./*
: NUL로 구분된 마지막 수정 시간 목록(가능한 한 정확하게)을 인쇄하고 그 뒤에 현재 작업 디렉터리에서 숨겨지지 않은 각 파일의 파일 경로를 인쇄합니다. 파일 이름이 다음으로 시작하는 문제를./
방지하기 위해 접두사가 붙습니다-
(--
GNU의stat
경우 파일은 호출된 것은-
여전히 의미로 해석될 것입니다.표준 입력);sort -zn
n
: NUL을 행 구분 기호로 사용하여 목록을 숫자로 정렬합니다.sed -z 's/[^ ]\{1,\} //;q'
: 첫 번째 NUL 종료 라인에서 공백 이외의 하나 이상의 문자를 포함하는 문자열의 첫 번째 항목을 제거하고q
첫 번째 라인을 처리 및 인쇄한 후 제거합니다.xargs -r0 rm
rm
:NUL로 끝나는 줄은 해당 줄이 존재하는 경우에만 인수로 전달됩니다.
% touch file1
% touch file2
% stat -c '%.Y %n' ./*
1447318965.123211222 ./file1
1447318965.784234234 ./file2
% stat --printf='%.Y %n\0' ./* | sort -zn | sed -z 's/[^ ]\{1,\} //;q' | xargs -r0 rm
% ls
file2
답변3
"액세스 시간" 또는 "수정 시간"을 기준으로 가장 오래된 파일을 결정합니까?
두 번째인 경우 다음 명령을 사용하십시오.
rm ls -l --sort=time | sed -n 2p | awk '{print $NF}'
답변4
에서는 zsh
파일 이름에 포함된 문자 또는 비문자에 관계없이 작동합니다.
rm -- *(Om[1])
마지막 수정 시간 (예: for 와 같이 가장 오래된 것부터 최신 것까지 ) Om
O
을 기준으로 역순으로 정렬 하고 첫 번째 일치 항목으로 확장을 제한합니다.m
ls -rt
[1]
또는:
rm -- *(-Om[1])
심볼릭 링크 확인 후 수정 시간을 고려하세요( -L
옵션을 사용하는 경우 ls
).
rm -- *(Om[1]^/)
파일 유형 제외목차( 어쨌든 rm
제거할 수 없음 -r
) -
심볼릭 링크가 해결된 후 유형과 기간을 고려하려면 접두사를 다시 사용하십시오. D
숨겨진 파일을 고려하려면 한정자를 참조하세요 .
.정기적인파일만.
bash
또는 다른 쉘 에서 zsh -c 'those codes above'
.