it-swarm-ko.tech

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

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

나는 시도했다

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

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

55
codedog

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

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

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

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

76
Shawn J. Goff

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

 -delete

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

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

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

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

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

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

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

0
froztbyte

시험:

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