가장 큰 파일을 찾으려면 다음 명령을 실행합니다.
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
또는 와 사이에 무언가를 삽입할 수 있습니다. 예를 들어stat
sort
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
.%n
find
%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
여기에는 각 파일에 대한 (하위 쉘 집중) 루프가 있습니다. echo
rm 명령으로 바꾸십시오 .
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(바이트)로 변경할 수 있습니다. 찾아야 할 옵션이 많이 있습니다. 이것은 강력한 명령입니다. 매뉴얼 페이지를 확인하십시오! :)