Bash 스크립트를 사용하여 디렉터리 전체에서 모든 파일(최신 파일 4개 제외) 삭제

Bash 스크립트를 사용하여 디렉터리 전체에서 모든 파일(최신 파일 4개 제외) 삭제

나는 디렉토리 목록으로 이동하여 가장 최근에 생성된 4개의 파일을 제외한 모든 파일을 삭제하는 Bash 스크립트를 찾고 있습니다.

어떻게 해야 하나요?

답변1

ls -t | sed '1,4d' | xargs echo rm

echo원하는 결과가 만족스러우면 제거하세요 .

공백이 포함된 파일 이름이 있으면 추가 작업이 필요합니다.

답변2

각 디렉터리에 가장 최근 파일 4개를 보관하시겠습니까, 아니면 모든 디렉터리에 가장 최근 파일 4개를 보관하시겠습니까?

첫 번째 문제를 해결하려면 find를 사용하여 각 디렉터리를 나열한 다음 각 디렉터리에서 가장 최근 파일 4개를 제외하고 모두 제거합니다. 이것은 별로 어렵지 않습니다.

두 번째 문제를 해결하려면 좀 더 생각이 필요하지만 실제로 작성하는 것이 더 쉽습니다.

기본적으로 모든 파일을 재귀적으로 찾습니다. 파일의 수정 시간과 이름을 반환하는 "stat" 명령을 호출합니다. 숫자를 기준으로 내림차순으로 정렬하고 가장 최근 파일인 처음 4개 파일을 건너뜁니다.

그런 다음 선행 타임스탬프를 제거하고 결과 파일 이름 목록을 제거합니다.

(테스트되지 않은) 것과 같은 것 :

#!/bin/bash

find "$@" -type f -print0 \
| xargs -0 stat -c$'%Y\t%n' \
| sort -rn \
| awk -F$'\t' 'NR > 4 {print $2}' \
| while read f; do
    echo rm -v "${f}"
  done

이 방법은 효과가 있지만 효과적으로 작동하려면 while 루프에서 '에코'를 제거해야 합니다. 먼저 신중하게 테스트해보세요!

답변3

나는 이것이 당신이 요구하는 것과는 다르다는 것을 알고 있지만 이러한 종류의 백업의 경우 새 파일을 만들기 전에 로그 파일을 회전하는 것을 선호합니다. 다음과 같이 좀 더 명확하고 코딩하기가 훨씬 간단합니다.

#!/bin/bash

#Archive old backups
move () {
  if [ -e $1 ]
  then
    echo "Archiving old backups: $1 to $2"
    mv -f $1 $2 || echo "FAILED"
  fi
}

#Bump each backup +1
rm -rf backup.4
move backup.3.tgz backup.4.tgz
move backup.2.tgz backup.3.tgz
move backup.1.tgz backup.2.tgz
move backup.tgz backup.1.tgz

#Now create today's backup
...

답변4

가장 간단한 방법:

for d in dir1 dir2 dir3; do
  rm -vf `ls -1t $d | head -n-4` 
done

관련 정보