나는 수십만 개의 파일이있는 디렉토리를 가지고 있습니다.
모든 파일을 삭제하고 싶지만 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