"인수 목록이 너무 깁니다"라고보고 될 때 디렉토리에서 모든 파일을 삭제하는 방법


답변:


11

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

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

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


거의 완벽 (내 게시물도 참조)
asdmin

2
리눅스에서는 "\;"대신 "+"를 사용하여 더 빠르게 할 수 있습니다. 그러면 "rm"당 더 많은 파일이 한 번에 제거됩니다.
Thomas

5
더 빠르다 : find dir/to/delete -delete( rm삭제할 파일 당 프로세스를 생성하지 않음 ).
Morten Siebuhr

Morten : 디렉토리 자체를 삭제하고 싶다고 언급 한 적이 없습니다. find dir/to/delete -type f -delete
richo

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

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

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

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

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


5
find가 어떻게 작동하는지 아는 사람을 만나서 반가워요 ... 또한 새로운 gnu find의 -delete action 또는 -exec 명령 {} +를 사용하여 xargs처럼 작동하는 것을 고려하십시오. 'man find'의 조치 섹션을 참조하십시오.
Kyle Brandt

-exec cmd {} +에 대해 몰랐습니다. 다소 유용 해 보입니다. -delete :)보다 약간 더 일반적입니다
David Pashley

-삭제는 괜찮을 수 있지만 개인적으로 다양한 컴퓨터에서 사용할 수있는 명령을 선호합니다. 내가 작업 솔라리스 시스템은 너무 -delete 그들에 작동하지 않을 것, 나이
asdmin

2
컴퓨터를 다른 사람이 동시에 사용하는 경우 ionice직전에 추가 rm하는 것이 좋습니다.
Hubert Kario

6

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

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

또는

ls WHATEVER | xargs rm -rf

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


2
find 솔루션은 모든 단일 파일에 대해 rm 명령을 호출하기 때문에 많은 파일에서 속도가 느립니다. xargs 솔루션은 빠르지 만 파일 이름에 공백이없는 경우에만 작동합니다 (그렇지 않으면 GNU find 및 find . -print0 | xargs -0 rm).
robcast

"find. -name WHATEVER -print0 | xargs -0 rm -rf"가 더 효율적입니다. find는 모든 파일에 대해 rm을 포크합니다. xargs는 파일을 최소로 줄입니다. 공백이있는 파일을 처리하려면 -print0 및 -0이 필요합니다. find에서 -depth를 사용하고 싶을 수도 있으므로 깊이를 먼저 검색해야합니다.
David Pashley

ls 명령은 "인수 목록이 너무 깁니다"를 반환하므로 작동하지 않습니다.
Brent

2
" ls *"을 (를)하고 있으며 " *"은 (는) 너무 긴 쉘이 불평하는 인수 목록으로 확장됩니다. ls .대신 " "를 수행하십시오 (또는 하나의 디렉토리 레벨로 올라가서 " ls [dirname]").
James Sneeringer

심히 길이에 쉘에 의해 substituded 될 뭐든 : 질문과 같은 이유로 작업이 작동하지 않을 것 | 번째 명령 행 (xargs를 RF RM은 뭐든 LS)
asdmin

3

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

cd ..

그리고 달리기 :

rm directory name -rf

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


1
디렉토리를 영구적으로 가질 필요가 없으며 모든 파일과 디렉토리를 재귀 적으로 삭제 해야하는 경우에만 작동합니다. 내 인생에서 대부분의 경우, 이런 식으로 작동하지 않았을 것입니다.
asdmin

2

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

LS -1 | xargs -n 100 rm -rf

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

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

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


"ls"가 작동하기에는 너무 큰 디렉토리에서 작동합니까? (같은 오류-논쟁 목록이 너무 깁니다)
Brent

예 Brent : ls를 호출 할 때 파일 스펙을 사용하지 마십시오. 위와 같이 -1 (대시 1) 만 사용하십시오. 위에서 설명한 것처럼 파일 목록을 쌍으로 묶어야하는 경우 ls 뒤에 grep을 사용하십시오. ls와 함께 와일드 카드를 사용하고 있지 않은지 확인한 후 "너무 긴"오류가 발생하면 xargs에 문제가있을 수 있습니다. 'xargs -n 100'대신 'xargs -n 5'를 사용하면 조금 느리면 확실히 안전해야합니다.
rixtertech 2009

1

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

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

0

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

작은 배치 (기본적으로 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

0

"인수가 너무 깁니다"또는 "메모리를 할당 할 수 없습니다"오류 해결

이것은 세션 폴더의 220,000+ 파일 에 대한 트릭을 수행 했습니다 ....

장점 : 즉시 파일 제거를 시작합니다

CD 경로 / 대상 / 폴더
LS -f | xargs rm -f -v

제거중인 파일의 스크린 샷을 보려면 클릭하십시오 - (~ 15 분 안에 모든 파일을 제거했습니다)

-f (ls 후) 가 미리 분류되지 않도록합니다.

-v (rm 이후) 는 각 파일이 제거 된 것으로 표시합니다.

쓰기 방지 된 파일에 대한 프롬프트없이 -f (rm 이후) 강제 실행

팁 : 파일을 삭제하는 동안 자동 생성 된 파일이 추가되지 않도록 폴더 이름을 바꿉니다 (예 : 세션을 session_old로) . 필자의 경우처럼 자동으로 원래 디렉토리가 아닌 경우 수동으로 원래 디렉토리를 다시 만들 수 있습니다


이전 답변에서 누락 된 답변의 새로운 기능은 무엇입니까?
user2233709
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.