가장 큰 파일을 찾아서 자동으로 삭제하세요

가장 큰 파일을 찾아서 자동으로 삭제하세요

가장 큰 파일을 찾으려면 다음 명령을 실행합니다.

du -Sh | sort -rh | head -5

그래서 나는 그렇게 했습니다 -rm rf someFile.

이전 명령에서 찾은 파일을 자동으로 삭제하는 방법이 있습니까?

답변1

Linux의 표준인 GNU 도구를 사용하는 경우 다음을 수행할 수 있습니다.

stat --printf '%s\t%n\0' ./* | 
  sort -z -rn | 
  head -z -n 5 | 
  cut  -z -f 2- |
  xargs -0 -r echo rm -f --

(테스트 후 "에코"를 제거했습니다).

stat명령은 현재 디렉터리에 있는 각 파일의 파일 크기와 이름을 탭으로 구분하여 인쇄하며, 각 레코드는 NUL(\0) 바이트로 끝납니다.

sort명령은 NUL로 끝나는 각 레코드를 역순으로 정렬합니다. 이 head명령은 처음 5개의 레코드만 나열한 다음 cut각 레코드에서 파일 크기 필드를 제거합니다.

마지막으로 xargs해당(여전히 NUL 종료) 입력을 가져와 매개변수로 사용합니다 echo rm -f.

레코드(파일 이름) 종결자로 NUL을 사용하기 때문에 유효한 문자가 포함된 파일 이름을 처리할 수 있습니다.

최소 파일 크기를 원할 경우 awk또는 와 사이에 무언가를 삽입할 수 있습니다. 예를 들어statsort

stat --printf '%s\t%n\0' ./* | 
  awk 'BEGIN {ORS = RS = "\0" } ; $1 > 25000000' |
  sort -z -rn | ...

참고: GNU에는 NUL 종료 레코드에 대한 옵션이 awk없지만 -z레코드 구분 기호를 원하는 대로 설정할 수 있습니다. 출력 레코드 구분 기호(ORS)와 입력 레코드 구분 기호(RS)를 NUL로 설정해야 합니다.


find다음은 명시적으로 자신을 제한하는 또 다른 버전입니다 .일반 파일(예: 디렉토리, 명명된 파이프, 소켓 등 제외) 지정된 디렉토리( -maxdepth 1하위 디렉토리 없음)에서만 크기가 25M보다 큽니다(필수 아님 awk).

stat이 버전에는 GNU 에도 해당 기능이 find있으므로 이 버전은 필요하지 않습니다 . printf그런데 , stat.​​%nfind%p

find . -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' | 
  sort -z -rn | 
  head -z -n 5 | 
  cut  -z -f 2- |
  xargs -0 -r echo rm -f --

다른 디렉토리에 대해 실행하려면 .find 명령을 바꾸십시오. 예를 들어find /home/web/ ....


쉘 스크립트 버전:

#!/bin/sh

for d in "$@" ; do
  find "$d" -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' | 
    sort -z -rn | 
    head -z -n 5 | 
    cut  -z -f 2- |
    xargs -0 -r echo rm -f --
done

예를 들어 경로 어딘가에 저장 delete-five-largest.sh하고 실행하십시오.delete-five-largest.sh /home/web /another/directory /and/yet/another

이 실행됩니다find ... 디렉터리당 한 번명령줄에 지정됩니다. 이것은아니요여러 경로 인수를 사용하여 한 번 실행하는 것과 같습니다 ( 스크립트에 루프가 없는 find것처럼 보입니다 ). 각 디렉터리에서 가장 큰 5개의 파일을 삭제하고 for 루프 없이 실행하면 모든 디렉터리를 검색할 때 발견된 가장 큰 5개의 파일만 삭제됩니다. 이는 디렉터리당 5개이며 총 5개입니다.find "$@" ...for

답변2

최신 GNU 도구를 사용하십시오(이미 GNU 특정 옵션을 사용하고 있습니다):

du -S0 . |sort -zrn | sed -z 's@[^/]*@.@;5q' | xargs -r0 echo rm -rf

( 만족스러우면 삭제하세요 echo).

/는 임의의 이름으로 파일/디렉토리를 복사할 수 있다는 것 -0입니다 .-z

대부분의 rm구현에서는 (현재 작업 디렉터리) 삭제를 거부하므로 .더 높은 수준에서 이 작업을 수행하고 다음을 수행해야 할 수도 있습니다.

du -S0 dir | sort -zrn | sed -z 's@\s*\d+\s*@@;5q' | xargs -r0 echo rm -rf

따라서 이 파일이 가장 큰 파일 중 하나라면 삭제할 수 있습니다 dir(모든 하위 디렉터리도 삭제된다는 점에 유의하세요). 귀하의 요청으로 볼 때 이것이 실제로 귀하가 원하는 것인지 확실하지 않습니다.

이제 가장 큰 5개만 삭제하고 싶다면정기적인파일(디렉토리, 장치, 심볼릭 링크와 같은 다른 유형의 파일은 포함하지 않음)에 대해 다음을 사용하면 됩니다 zsh.

echo rm -f ./**/*(D.OL[1,5])

( OL길이의 역순(디스크 사용량이 아닌 크기)).

답변3

여기에는 각 파일에 대한 (하위 쉘 집중) 루프가 있습니다. echorm 명령으로 바꾸십시오 .

du -Sh /your/search/path/ |\
sort -rh |\
head -5 |\
awk '{print $2}' |\
while read file ; do
  echo "$file"
done

실제 bash에서 작동합니다. 그러나 이것은 확실히 좋은 스크립트는 아닙니다. 파일 이름의 공백으로 인해 일부 댓글을 받을 수 있을 것이라고 확신합니다. ;) 환영합니다!

크론 작업에 익숙하다면 이 스크립트를 정기적으로 실행하세요.

답변4

여기에 간단한 대답이 있습니다. 도움이 되기를 바랍니다. 'find / -type f -size 1G -exec rm {} \;' 이렇게 하면 루트 디렉터리에서 크기가 1G보다 큰 모든 파일(디렉터리 아님)을 찾아서 삭제합니다. 예를 들어 이름별로 파일을 선택해야 하는 경우 exec 뒤에 추가 파일 정렬을 추가할 수 있습니다. 크기는 M(메가바이트), k(킬로바이트), c(바이트)로 변경할 수 있습니다. 찾아야 할 옵션이 많이 있습니다. 이것은 강력한 명령입니다. 매뉴얼 페이지를 확인하십시오! :)

관련 정보