글쓴이 보관물: 소장 마

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

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

나는 시도했다

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

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



답변

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

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

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

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


답변

매뉴얼 페이지에 명시된 바와 같이 의도적 인 행동으로 인해 문제 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

답변

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


답변

시험:

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

답변

간단한 명령 :

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

행운을 빕니다!


답변