2014-07-19 3 views
1

나는 파이프 라인 아래의 명령을 원하지만 마지막 cmd를 "RF RM은"은 삭제 즉 아무것도 작동하지된다find 또는 sed에서 전달 된 파일을 rm이 제거하지 않는 이유는 무엇입니까?

find /home/mba/Desktop/ -type d -name "logs" | sed 's/$/\/\*/' | rm -rf 

오류가 반환되지 않습니다.

+0

@CodeGnome : 추가 정보를 자신의 게시물을 참조하십시오 : http://stackoverflow.com/q/24841899/3776858 – Cyrus

답변

4

rm 명령은 표준 입력에서 파일 이름을 가져 오지 않습니다. sed에서 rm으로 파이프하려면 xargs을 사용할 수 있습니다.

find /home/mba/Desktop/ -type d -name "logs" | sed 's/$/\/\*/' | xargs rm -rf 
+0

Sed의 명령이 필요하지 않습니다. find 명령은 각 경로의 마지막 구성 요소가 "logs"인 디렉토리 경로 목록을 인쇄합니다. rm 명령을 -r 옵션과 함께 사용하면 재귀 적으로 디렉토리가 삭제됩니다. – Nick

4

쉬운 형태 : 예를 들어

find /home/mba/Desktop/ -regex '.*/logs/[^/]+$' -exec rm -fr -- {} + 

그것은 이름 logs을 갖는 임의의 디렉토리에있는 모든 파일을 일치합니다.

만약 xargs 여전히 선호 :

find /home/mba/Desktop/ -regex '.*/logs/[^/]+$' -print0 | xargs -0 rm -fr -- 

당신은 -n로 한 번에 삭제할 파일의 수를 제한 할 수 있습니다

find /home/mba/Desktop/ -regex '.*/logs/[^/]+$' -print0 | xargs -0 -n 2000 rm -fr -- 
  • 우리는 같은 \x00을 가지고 -print0-0를 사용 구분 기호. 이렇게하면 공백이 포함 된 파일 이름을 사용하여 명령을 안전하게 유지할 수 있습니다.
  • --rm을 추가하면 -으로 시작하는 파일을 제거 할 수 있습니다.
+0

또는'-name '*/logs/*'. – chepner

+1

@chepner 아마도'-wholename'을 의미 할 것입니다. 그러나 그것은 또한 1 레벨보다 큰 파일과 일치 할 것이고 나중에 부모가 삭제 되었기 때문에 그 파일이 모두 발견되지 않았을 때 오류를 일으킬 것입니다. 아니면'rm -fr'이 어쨌든 그것을 무시할 지 모르지만 여전히 비효율적입니다. – konsolebox

+0

인수의 수를 rm으로 제한 할 때 이점이 없습니다. xargs는 os에서 지원할 수있는 인수를 많이 가진 명령 실행을 생성합니다 (최대 131072 바이트까지 다를 수 있음). 이처럼 숫자를 제한하면 명령을 더 많이 호출하고 모든 작업을 느리게 수행 할 수 있습니다. 찾기 위해 -exec 인수가 아닌 xargs를 사용하려는 이유는 명령을 실행해야하는 횟수를 줄이려는 것입니다. – Nick

1

"표준 입력은 STDOUT 섹션에 지정된 각 프롬프트에 대한 응답으로 입력 라인을 읽는 데 사용되어야하며 그렇지 않으면 표준 입력을 사용하지 않아야합니다."

출처 : http://pubs.opengroup.org/onlinepubs/007904975/utilities/rm.html

예 :

yes n | rm -ir dir1 dir2 dir3  # won't delete dir1 dir2 dir3 

yes y | rm -ir dir1 dir2 dir3  # delete dir1 dir2 dir3