와일드 카드로 디렉토리를 재귀 적으로 삭제하려면 어떻게합니까?


51

WD My Book World Edition에서 SSH를 통해 작업하고 있습니다. 기본적으로 특정 디렉토리 수준에서 시작하고 일치하는 모든 하위 디렉토리를 재귀 적으로 제거하고 싶습니다 .Apple*. 어떻게하면 될까요?

나는 시도했다

rm -rf .Apple*rm -fR .Apple*

하위 디렉토리 내에서 해당 이름과 일치하는 디렉토리를 삭제하지 않았습니다.

답변:


73

find 전체 트리에서 선택적으로 작업을 수행하는 데 매우 유용합니다.

find . -type f -name ".Apple*" -delete

여기서는 -type f디렉토리가 아닌 파일인지 확인하고 심볼릭 링크, 소켓 및 기타 항목을 건너 뛰기 때문에 원하는 것이 아닐 수도 있습니다. 당신이 사용할 수있는 ! -type d문자 그대로 디렉토리를 의미하지하는,하지만 당신은 또한 문자와 블록 장치를 삭제할 수 있습니다. -type에 대한 매뉴얼 페이지 에서 술어를 살펴볼 것을 제안 합니다 find.

와일드 카드로 엄격하게 수행하려면 고급 셸 지원이 필요합니다. Bash v4에는을 사용하여 하위 디렉토리를 재귀 적으로 일치시킬 수 있는 globstar옵션 이 있습니다 **. zsh그리고 ksh이 패턴을 지원합니다. 그것을 사용하면 할 수 있습니다 rm -rf **/.Apple*. 이것은 POSIX 표준이 아니며 이식성이 좋지 않기 때문에 스크립트에서 사용하지 않는 것이 좋지만 일회성 대화 형 셸 동작에는 문제가 없습니다.


3
나는 find . -type d -name .Apple*일할 수있다 -그것은 모든 폴더를 나열합니다. 그러나 -delete끝에 추가하면 실패합니다 . 사용법 요약과 함께 다시 제공됩니다. BusyBox v1.1.1에서 실행 중입니다. 차이가 있습니까?
codedog

1
-deletePOSIX도 아닙니다. 90 년대 초 **에 소개되었습니다 zsh. 그것은 ksh93, fish, bash 및 tcsh에도 있습니다 (연대순으로 나타남).
Stéphane Chazelas

1
–1rm -rf **/.Apple*
Andriy Boyko

1
@codedog, 작동 -delete하지 않으면 -exec rm -f {} +대신 사용하십시오.
와일드 카드

1
find삭제하면서 자세하게 설명 할 수 있습니까 ? "globstar"메소드가 -v스위치 를 추가하여이 작업을 수행한다고 가정합니다 .
Demis

16

매뉴얼 페이지에 명시된 바와 같이 의도적 인 행동으로 인해 문제 find-delete발생했습니다 find(예 : 경로가 ./로 시작하면 경로 삭제를 거부 함).

 -delete

찾은 파일 및 / 또는 디렉토리를 삭제하십시오. 항상 true를 반환합니다. 찾기가 트리 아래로 반복 될 때 현재 작업 디렉토리에서 실행됩니다. 경로 이름에 "/"를 기준으로 "/"문자가있는 파일 이름은 삭제하지 않습니다. 보안상의 이유로.
이 옵션은 깊이 우선 순회 처리를 의미합니다.
다음 심볼릭 링크는이 옵션과 호환되지 않습니다.

대신, 나는 단지 할 수 있었다

find . -type d -name 'received_*_output' -exec rm -r {} +

귀하의 경우, glob (별표, *)를 인용하는 것이 해결책이지만, 다른 사람이 비슷한 문제를 겪을 경우에 대비하여 답변을 드리고 싶습니다.

참고 : 이전에는 제 대답은 다음을 수행하는 것이었지만 @Wildcard는 주석에서 보안 결함을 지적했습니다.

find . -type d -name 'received_*_output' | xargs rm -r

1
xargs여기 에 사용할 이유가 없습니다 . -exec rm -r {} \;또는 -exec rm -r {} +특수 문자 파일 이름을 사용하지 않고도 더 잘 수행 할 수 있습니다. find의 출력을 반복하는 것이 왜 나쁜 습관입니까?를
와일드 카드

알아두면 좋습니다. 명령이 여전히 작업을 수행하므로 성능 저하 (IMO)는 가치가 없지만 성능 최적화는 높이 평가됩니다.
Pat

1
그것이 성능 최적화 일 경우 나는 당신에게 동의 할 것이지만 그렇지 않습니다. 보안 허점입니다. 이름에 공백이있는 파일을 올바르게 처리하지 않으면 악의적으로 제작 된 파일 이름으로 인해 데이터가 손실됩니다. 또한 bash / POSIX 쉘에서 변수를 인용하는 것을 잊어 버린 보안 함의를 참조하십시오 . 그중 일부 는 적용 가능하며 적어도 내가 이야기하고있는 문제 유형 에 대한 아이디어를 줄 수 있습니다 .
와일드 카드

mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'데이터 손실 가능성이 없다고 생각되면 디렉토리에서 시도한 후 동일한 명령을 다시 실행하십시오. 또는 Mac OS에 관한 질문이므로 mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'. ( 경고 : 이 작업을 수행하면 모든 파일이 삭제됩니다. 내 말이
Wildcard

0

가능한 이유는 rm / find 명령에 아무런 문제가 없지만 로그인 한 사용자에게는 실제로 삭제 권한이없는 것입니다. 사용 ls -l권한이있는 항목을 나열하는 데 사용하고 사용중인 사람 idgroups명령을 식별 할 수 있습니다 (사용 가능해야 함). "잘못된 사용자"인 경우 파일의 권한 / 소유권을 변경하거나 다른 사용자로 전환해야합니다.


0

시험:

shopt -s dotglob           # using Bash
printf '%s\n' ./.Apple*    # test
#rm -rf ./.Apple*    

1
dotglob쓸모가 없습니다. dotglob의 기능에 대한 예는 이 페이지 를 참조하십시오 .
amphetamachine

-1

간단한 명령 :

rm `find ./ -name '.Apple*'` -rf

행운을 빕니다!


4
이것은 매우 오류가 발생하기 쉽고, 찾기 -exec 키가 있습니다.
Anton Barkovsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.