가장 큰 크기의 파일을 제외하고 접두사가 있는 모든 파일 삭제

가장 큰 크기의 파일을 제외하고 접두사가 있는 모든 파일 삭제

현재 디렉터리에서 특정 접두사가 있는 모든 파일을 삭제하는 가장 좋은 방법은 무엇입니까(이 접두사가 있는 모든 파일 중에서 크기가 가장 큰 파일 제외)?

(가장 큰 것이 고유하지 않은 경우 무작위로 하나를 유지하고 나머지는 삭제합니다.)

예를 들어 현재 디렉터리에는 다음 파일이 포함되어 있습니다.

-rw-rw----  1 user user 3468 Jan 01 00:00 filea
-rw-rw----  1 user user 3434 Jan 01 00:00 pre_0
-rw-rw-r--  1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r--  1 user user 1950 Jan 01 00:00 filec
-rw-rw-r--  1 user user 8654 Jan 01 00:00 pre_1
-rw-rw----  1 user user 6508 Jan 01 00:00 pre_2

명령이나 스크립트를 실행하여 접두사가 "pre_"인 가장 큰 파일을 제외한 모든 파일을 제거한 후 현재 디렉터리는 다음과 같이 나열되어야 합니다.

-rw-rw----  1 user user 3468 Jan 01 00:00 filea
-rw-rw-r--  1 user user 9769 Jan 01 00:00 fileb
-rw-rw-r--  1 user user 1950 Jan 01 00:00 filec
-rw-rw-r--  1 user user 8654 Jan 01 00:00 pre_1

답변1

여러 유틸리티를 조합하여 사용할 수 있습니다.

stat -c '%s %n' pre_* | sort -k1,1rn | tail -n +2 | cut -d' ' -f2 | xargs rm

GNU 시스템이고 특이한 파일 이름이 없다고 가정합니다.

  • statpre_*공백으로 구분된 모든 파일의 파일 크기와 이름을 가져옵니다.

  • sort파일 크기를 기준으로 파일 정렬(가장 큰 파일부터 정렬)

  • tail -n +2가장 큰 파일을 제외한 나머지 파일 가져오기

  • cut -d' ' -f2파일 이름만 가져오고, 삭제하려면 rm( )xargs rm

답변2

그리고 zsh:

rm -f pre*(OL[2,-1])
  • OL: 크기가 작은 순서대로
  • [2,-1]: 마지막에서 두 번째만

GNU 유틸리티에 해당하는 기능은 bash다음과 유사합니다.

eval "files=($(LC_ALL=C ls --quoting-style=shell-always -dS ./pre*))"
rm -f "${files[@]:1}"

비정규 파일의 크기는 일반적으로 그다지 관련이 없으므로 일반 파일로 제한하고 싶을 수도 있습니다.

rm -f pre*(.OL[2,-1])

(직접 bash+GNU에 상응하는 것은 없습니다). 일반 파일에 심볼릭 링크를 포함하고 심볼릭 링크 대상의 크기를 고려할 수 있습니다.

rm -f pre*(-.OL[2,-1])

를 사용하여 심볼릭 링크 대상의 크기를 고려하는 옵션을 ls추가합니다 .-L

관련 정보