와일드카드를 사용하여 디렉터리를 재귀적으로 삭제하는 방법은 무엇입니까?

와일드카드를 사용하여 디렉터리를 재귀적으로 삭제하는 방법은 무엇입니까?

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

나는 노력했다

rm -rf .Apple*그리고rm -fR .Apple*

해당 이름과 일치하는 하위 디렉터리는 삭제되지 않습니다.

답변1

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

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

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

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

답변2

매뉴얼 페이지에 명시된 의도적인 동작으로 인해(예: 경로가 ./ 로 시작하는 경우 삭제 거부, 제 경우에는 이 작업이 수행됨) 다음을 find사용하는 데 문제가 있습니다.-deletefind

 -delete

발견된 파일 및/또는 디렉터리를 삭제합니다. 항상 true를 반환합니다. 트리에서 find가 반복되면 현재 작업 디렉토리에서 수행됩니다. 경로 이름에 "."를 기준으로 "/" 문자가 포함된 파일 이름은 제거하지 않습니다. 보안상의 이유로.
이 옵션은 깊이 우선 순회 처리를 의미합니다.
다음 기호 링크는 이 옵션과 호환되지 않습니다.

대신에 나는 할 수 있었다

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

귀하의 경우 glob(asterisk, *) 를 인용하는 것이 해결책인 것 같지만, 비슷한 문제가 있는 다른 사람이 있을 경우를 대비해 답변을 제공하고 싶었습니다.

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

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

답변3

노력하다:

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

답변4

간단한 명령:

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

행운을 빌어요!

관련 정보