“인수 목록이 너무 깁니다”라고보고 될 때 디렉토리에서 모든 파일을 삭제하는 방법 디렉토리를 가지고 있습니다.

나는 수십만 개의 파일이있는 디렉토리를 가지고 있습니다.

모든 파일을 삭제하고 싶지만 rm * -f 보고서 : “인수 목록이 너무 깁니다”

이 디렉토리를 지우는 가장 좋은 방법은 무엇입니까?



답변

디렉토리를 제거 할 수없는 경우 언제든지 찾기를 사용할 수 있습니다.

find . -maxdepth 1 -type f -exec rm -f {} \;

현재 디렉토리의 모든 파일과 현재 디렉토리 (하위 디렉토리가 아닌) 만 삭제됩니다.


답변

찾기 . -maxdepth 1-타입 f -exec rm -f {} \;

단순히 너무 오래 걸린다 (파일 당 rm의 1 개 exec).

이것은 훨씬 더 효율적입니다.

찾기 . -maxdepth 1 유형 f -print0 | xargs -r0 rm -f

가능한 한 rm에 대한 인수만큼 많은 파일 이름을 취한 다음 다음 파일 이름로드로 rm을 실행합니다 … rm은 2 또는 3 번만 호출 될 수 있습니다.


답변

둘 다 문제를 해결할 것입니다. 여기에 각 기술의 각 성능에 대한 분석이 있습니다 .

find . -name WHATEVER -exec rm -rf {} \;

또는

ls WHATEVER | xargs rm -rf

문제는 디렉토리의 모든 항목과 함께 “*”를 확장하는 bash에서 비롯됩니다. 두 솔루션 모두 각 파일을 차례로 처리합니다.


답변

한 수준을 백업하여이 작업을 수행 할 수있었습니다.

cd ..

그리고 달리기 :

rm directory name -rf

그런 다음 디렉토리를 다시 작성하십시오.


답변

이 찾기 호출은 모두 훌륭하지만 서두를 때 필요한 명명법을 거의 기억하지 못합니다. 대신 ls를 사용합니다. 누군가 언급했듯이 ls. 작동하지만 ls -1을 선호합니다.

LS -1 | xargs -n 100 rm -rf

-n xxx 숫자는 최대 값을 초과하면 자동 수정되거나 (크기 최대 값을 초과 한 경우 -s 참조) 앱의 args-max를 초과하면 대체로 안전합니다. 분명한.

grep은 큰 디렉토리에서 파일의 서브 세트 만 삭제하고 어떤 이유로 든 find를 사용하지 않으려는 경우이 체인의 중간에 삽입하는 것이 편리합니다.

이 답변은 ls, xargs 등을 위해 Gnu 코어 유틸리티를 사용한다고 가정합니다.


답변

-exec +옵션을 사용하여 가능한 한 몇 번 rm을 실행하려고하는지 더 빨리 찾을 수 있습니다.

find . -type f -exec rm '{}' +

답변

시스템이 응답을 유지해야 할 때 많은 파일을 삭제하는 버전이 있습니다.

작은 배치 (기본적으로 100 개 파일)로 작업을 발행하고 다른 작업이 완료 될 때까지 약간 대기하여 작동합니다.

ext3의 단일 디렉토리에서 50 만 개가 넘는 파일을 삭제하기 위해 훌륭하게 작동했습니다. 약간의 보너스로 수행 한 비율을 인쇄합니다.

noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do
   n=$((n+100));
   sync;
   echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
   sleep 5;
done