크기가 1MB 미만인 파일을 재귀 적으로 제거


답변:


21

이 작업은 find다음 과 같이 수행 할 수 있습니다 .

find . -type f -size -1M -exec rm {} +

이는 하위 디렉토리로 재귀 적으로 내려 가며 1MB보다 작은 모든 파일을 무조건 삭제합니다. 조심해.


에 대한 경로 논쟁이 없습니다find

@Useless : GNU find입니다. :)
Sven Marnach

2
@DanielAndersson : 단일 프로세스 호출로 보장되는와 find달리 시스템의 한계에 맞도록 호출 된 프로세스로 인수 수를 제한합니다 rm *. 필요한 경우 find여러 인스턴스를 호출 rm합니다. 그리고 줄 바꿈 문자를 포함하여 특수 문자가 올바르게 취급된다고 확신합니다. 내가 선호하지 -exec rm를 통해 -delete유연성을 이유로 - 예를 들어, 후자의 제공 방법 삭제 쓰기 보호 된 파일에.
Sven Marnach 2013

1
@Invoker : 변경 사항이 올바르지 않아 되돌 렸습니다. -1M원하는대로 1MB 미만을 의미합니다. 귀하의 버전은 정확히 1 메가 바이트 크기의 모든 파일을 삭제하는데, 이는 다소 의미없는 작업으로 보입니다.
Sven Marnach

2
관심있는 사람이라면 1M 보다 큰 파일을 모두 제거 하려면 명령을 사용하십시오 find . -type f -size +1M -exec rm {} +. -1M 대신 + 1M을 참고하십시오.
chessofnerd

10

이것은 일을해야합니다 :

$ find <directory> -type f -size -1M -delete

1M부터 하이픈을 사용할 필요는 없다고 생각합니다.
Invoker

2
@Invoker, 나는 -부호가 "1M 미만"을 의미하는 빼기 부호 라고 믿는다 . 실행 find <directory> -type f -size +1M -delete하면 1M 보다 큰 모든 파일이 삭제됩니다 .
chessofnerd

네 넌 내 잘못이야
Invoker

2

다양성과 가능한 (아마도 한계가있는) 성능 향상을 위해 :

find <directory> -type f -size -1M -print0  | xargs -0 rm

이것은 어떻게 더 빨라야합니까? 추가 xargs프로세스를 시작합니다 .
Sven Marnach

이제 동일한 블록 장치에 대해 두 개의 CPU를 경합 할 수 있습니다 ! 더 현명하게도 stat / readdir 작업은 링크 해제 작업에 의해 동 기적으로 차단되지 않습니다. 이것이 더 나을지의 여부는 서브 트리 크기, 파일 수, 장치 등에 달려 있습니다.


-1

이 링크 http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ 를 확인하십시오. 원하는 링크 가 정확히 있습니다.

for file in *;
  do
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";
    fi;
done

for 루프를 사용하여 모든 파일을 반복 한 다음 du와 awk를 사용하여 위 예제와 같이 파일 크기를 찾을 수 있습니다.


SO에 대한 답변은 독립적이어야합니다. 단순한 링크를 게시하지 마십시오. 또한 링크 된 게시물의 코드는 1M보다 작은 파일이 아닌 빈 파일을 삭제합니다.
Sven Marnach

@SvenMarnach는 주어진 코드 예제 링크에서 $ file_size <1M을 사용할 수 없습니다.

셸은 이해할 수 없으므로 아니요 1M.
Sven Marnach

1M에 의해 나는 1048576 1MB를 바이트로 변환하는 것을 의미했다

1
글쎄, 이것이 실제로 작동하는지 테스트하고 코드를 답변에 복사하면 SO 답변이 될 수 있습니다.
Sven Marnach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.