저는 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
사용하는 데 문제가 있습니다.-delete
find
-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
행운을 빌어요!