현재 디렉터리에서 특정 접두사가 있는 모든 파일을 삭제하는 가장 좋은 방법은 무엇입니까(이 접두사가 있는 모든 파일 중에서 크기가 가장 큰 파일 제외)?
(가장 큰 것이 고유하지 않은 경우 무작위로 하나를 유지하고 나머지는 삭제합니다.)
예를 들어 현재 디렉터리에는 다음 파일이 포함되어 있습니다.
-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 시스템이고 특이한 파일 이름이 없다고 가정합니다.
stat
pre_*
공백으로 구분된 모든 파일의 파일 크기와 이름을 가져옵니다.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