마지막으로 생성된 보관 로그를 유지하는 것을 제외하고 전체 보관 로그를 삭제하고 싶습니다.

마지막으로 생성된 보관 로그를 유지하는 것을 제외하고 전체 보관 로그를 삭제하고 싶습니다.

모든 보관 로그를 삭제하고 마지막으로 생성된 보관 로그만 유지하고 싶습니다.

현재 전체/모든 아카이브 로그를 삭제하고 디렉터리 자체를 지우는 다음 명령을 사용하고 있습니다.

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) /tmpls -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.

관련 정보