가장 큰 파일을 제외한 접두사가있는 모든 파일을 제거하십시오.


6

이 접두사가 있지만이 접두사가있는 모든 파일 중에서 크기가 가장 큰 파일을 제외하고 접두사가있는 현재 디렉토리의 모든 파일을 제거하는 가장 좋은 방법은 무엇입니까?

(가장 큰 것이 유일하지 않은 경우 무작위로 그중 하나를 유지하고 다른 것을 제거하십시오.)

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

-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

2
나는 단지 이것에 대한 실제 응용 프로그램이 무엇인지 궁금합니다. 로그 파일 또는 다양한 크기로 크기가 조정 된 (사진 크기가 더 작은 파일을 삭제하려는) 사진 갤러리의 파일 등을 관리합니까?
Kusalananda

@Kusalananda 네, 제 경우의 응용 프로그램은 로그 / 레코드 파일 관리입니다. 언급 한 사진 갤러리 관리에 대한 다른 응용 프로그램도 매우 흥미 롭습니다.
D. Chen

답변:


7

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

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)는 제거를 수행합니다.


1
공백이있는 파일 이름으로는 작동하지 않습니다. 의 단계에서 깰 것입니다 cut. cut호출이로 대체 되면 적어도 해당 단계를 수정할 수 있습니다 sed 's@^[^ ]\+ @@'. xargs제대로 작동하는지 확실하지 않습니다 .
Ruslan

@Ruslan 그것은 stat그때 단계 에서 깨질 것입니다 , 그래서 내가 특별한 파일 이름을
heemayl

왜? 쉘 글로브가 따옴표 / 이스케이프 된 이름으로 확장되지 않습니까?
Ruslan

statNUL로 분리하여 출력을 보낼 수 없습니다. 그 이유는 ..
heemayl

글쎄, 나는 파일 이름의 줄 바꿈이 드물다는 것을 알고 있지만 왜 공간이 비정상적이라고 가정합니까?
Ruslan

7

zsh:

rm -f pre*(OL[2,-1])
  • OL: 크기별로 역순
  • [2,-1]: 두 번째부터 마지막까지

with bash와 GNU 유틸리티는 다음과 같습니다.

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옵션을 추가하십시오 .


와우, 아마도 뭔가가있을 것입니다 zsh... 지금까지 실제로 배우지 못했습니다. 좋은 출발점을 찾지 못했습니다.
와일드 카드

1
@Wildcard는 물론 :-)가 있습니다. 사용자 안내서로 시작할 수 있습니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.