모든 보관 로그를 삭제하고 마지막으로 생성된 보관 로그만 유지하고 싶습니다.
현재 전체/모든 아카이브 로그를 삭제하고 디렉터리 자체를 지우는 다음 명령을 사용하고 있습니다.
find . -name "dbf*" -mtime +0 -exec rm -rf {} \;
하지만 마지막으로 생성된 아카이브 로그를 유지하고 싶습니다. 어떻게 하나요? 동일한 결과를 얻으려면 어떤 명령을 사용해야 합니까?
답변1
하루에 하나의 파일만 생성된다는 것을 알 수 없는 경우(이 경우 실패한 명령이 작동함) find
파일의 날짜/시간 스탬프와 파일 이름 조합의 출력을 파이프한 sort
다음 sed
날짜/시간 스탬프를 분할하고( 다시 sed
) 제외해야 합니다. 결과 이름을 입력하기 전 마지막 줄 xargs -0 rm
:
find . -type f -name "dbf*" -printf "%T@:%p\0" | sort -z | sed -z '$d' | \
sed -z 's/[0-9\.]*://' | xargs -0 rm
파일 이름은 ./
두 번째 파일 이름으로 시작 하므로 sed
일치 항목이 너무 많더라도 첫 번째 ":"만 일치합니다( -printf "%T@:%p"
이와 같은 결과 제공 1424765805.0206990940:./dbf_xyz
).
이는 전체 체인이 NUL로 끝나는 "라인"을 사용하기 때문에 공백과 개행 문자가 있는 파일 이름에도 적용됩니다.
답변2
이 방법은 나머지 파일을 삭제하면서 최신 파일을 다른 디렉터리에 복사해도 괜찮은 경우에 효과적입니다. 현재 작업 디렉터리가 로그가 포함된 디렉터리라고 가정합니다.
cp $(ls -Art | tail -n 1) /tmp \
&& rm -ri /path/to/logs \
&& cp /tmp/$(ls -Art /tmp | tail -n 1) ./ \
&& rm -i /tmp/$(ls -Art /tmp | tail -n 1)
분할:
cp $(ls -Art | tail -n 1) /tmp
ls -Art | tail -n 1
가장 최근에 수정된 파일을 출력해야 하는 파일을/tmp
디렉터리에 복사합니다. 대신 이를 위해 새 디렉토리를 생성하거나/tmp
다른 수정된 파일이 없는 디렉토리를 사용해야 합니다.rm -ri /path/to/logs
이 디렉터리의 모든 파일 설명자를 삭제해야 합니다.cp /tmp/$(ls -Art /tmp | tail -n 1) ./
/tmp
가장 최근에 수정된 파일이 작업 디렉터리에 다시 복사됩니다 .rm -i /tmp/$(ls -Art /tmp | tail -n 1)
에 복사된 파일을 삭제하세요/tmp
.