디렉토리에서 특정 확장자를 가진 모든 파일을 삭제하는 방법(마지막 5개 제외)

디렉토리에서 특정 확장자를 가진 모든 파일을 삭제하는 방법(마지막 5개 제외)

이 디렉토리에는 다양한 확장자를 가진 파일이 포함되어 있습니다. 마지막 5개 파일을 제외하고 확장자가 .gz, zx, ext4인 모든 파일을 삭제하고 싶습니다. 이 모든 파일을 나열할 수 있습니다.

ls -l | grep '\.gz\|xz\|ext4$'

그 중 가장 오래된 5개만 보여 드리겠습니다.

ls -l | grep '\.gz\|xz\|ext4$' | head -5

또는 마지막 5개 파일을 나열하십시오.

ls -l | grep '\.gz\|xz\|ext4$' | tail -5

그런데 위 명령에 나열된 5개 파일을 제외한 모든 파일을 삭제하는 방법을 모르겠습니다.

답변1

일반적인 정렬 순서가 적절하고(즉, 파일 이름이 날짜별로 지정됨) 쉘이 배열을 지원하는 경우 배열을 사용하여 다음을 피할 수 있습니다.사용시 일반적인 주의사항ls:

F=(./*.{gz,xz,ext4})          # list files
G=("${F[@]:5}")               # pick all but the first five to another array
G=("${F[@]:0:${#F[@]}-5}")    # or pick all but the last five
rm -- "${G[@]}"               # remove them

zsh자체적으로 날짜별로 정렬할 수 있으므로 일치하는 파일을 배열로 가져와 수정 시간별로 정렬합니다.

F=(./*.(gz|xz|ext4)(Om))

( (Om)최신순, (om)최신순) 위와 같이 배열을 처리합니다.


물론, 수정된 날짜별로 정렬해야 하는 경우에는 다음을 사용할 수 없습니다 zsh.파일 이름을 아는 것이 좋습니다, 간단한 것이 ls -t | tail -n +6좋습니다. ( tail -n +6인쇄는 6행에서 시작됩니다. 즉, 처음 5행을 건너뜁니다. 처음에는 이에 대한 편견이 있었습니다.)

GNU ls를 사용하면 쉘에 적합한 입력을 생성하기 위해 파일 이름을 인용하도록 요청한 다음 출력으로 배열을 채울 수 있다고 생각합니다.

eval "F=($(ls -t --quoting-style=shell-always ./*.{xz,gz}))"

그러나 이를 위해서는 이를 믿고 ls쉘이 인용문을 해석하는 방법에 동의해야 합니다.

답변2

ls -1 | grep '\.gz$\|xz$\|ext4$' | tail -n +6 | xargs rm

참고: 파일에는 공백/따옴표가 포함되어서는 안 됩니다.

set -f; set ./*.[gx]z ./*.ext4; [ "$#" -gt 5] && shift 5; rm -f "$@"

다음은 모든 유형의 파일 이름에 적용됩니다.

td="`mktemp`" \
   find . -maxdepth 1 -type f \( -name \*.[gx]z -o -name \*.ext4 \) -exec sh -c '
      [ ! -s "$td" ] && [ "$#" -gt 5 ] && { shift 5; echo >> "$td"; }
      rm -f "$@"
   ' x {} +
rm "$td"

답변3

거의 다 왔습니다.

긴 옵션 형식을 사용하여 원하는 줄 수를 지정한 다음 이를 무효화합니다. (반대 논리를 와 함께 사용할 수 있습니다 tail).

head --lines=3헤더에서 세 줄을 인쇄합니다.

head --lines=-3마지막 3개를 제외하고 머리부터 모든 것을 인쇄합니다.

head다음은 a와 8줄 파일을 사용하는 예입니다.f

$ cat f
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
$ head -3 f
line 1
line 2
line 3
$ head --lines=3 f
line 1
line 2
line 3
$ head --lines=-3 f
line 1
line 2
line 3
line 4
line 5

파일 삭제를 시작하기 전에 이 섹션에서 원하는 결과가 나오는지 확인하세요.

긴 옵션이 꼭 필요한 것은 아니지만 tail 및 head 명령의 진화와 이전 버전과 호환되어야 하는 유산이 없으며 기억하기가 더 쉽습니다.

head -n-3매수 옵션과 동일head --lines=-3 f

아래를 참조하세요

$ head -3 f #originally
line 1
line 2
line 3
$ head -n3 f #
line 1
line 2
line 3
$ head -n+3 f
line 1
line 2
line 3
$ head -n-3 f
line 1
line 2
line 3
line 4
line 5
$

답변4

다음 명령은 마지막 5개 파일을 제외한 모든 파일을 나열합니다.

ls -l | grep '\.gz\|xz\|ext4$' | head -n `expr \`ls | grep '\.gz\|xz\|ext4$' | wc -l\` - 4`

파일을 쉽게 삭제하려면 이를 명령으로 변환할 수 있어야 합니다.

관련 정보