답변:
find
전체 트리에서 선택적으로 작업을 수행하는 데 매우 유용합니다.
find . -type f -name ".Apple*" -delete
여기서는 -type f
디렉토리가 아닌 파일인지 확인하고 심볼릭 링크, 소켓 및 기타 항목을 건너 뛰기 때문에 원하는 것이 아닐 수도 있습니다. 당신이 사용할 수있는 ! -type d
문자 그대로 디렉토리를 의미하지하는,하지만 당신은 또한 문자와 블록 장치를 삭제할 수 있습니다. -type
에 대한 매뉴얼 페이지 에서 술어를 살펴볼 것을 제안 합니다 find
.
와일드 카드로 엄격하게 수행하려면 고급 셸 지원이 필요합니다. Bash v4에는을 사용하여 하위 디렉토리를 재귀 적으로 일치시킬 수 있는 globstar
옵션 이 있습니다 **
. zsh
그리고 ksh
이 패턴을 지원합니다. 그것을 사용하면 할 수 있습니다 rm -rf **/.Apple*
. 이것은 POSIX 표준이 아니며 이식성이 좋지 않기 때문에 스크립트에서 사용하지 않는 것이 좋지만 일회성 대화 형 셸 동작에는 문제가 없습니다.
-delete
POSIX도 아닙니다. 90 년대 초 **
에 소개되었습니다 zsh
. 그것은 ksh93, fish, bash 및 tcsh에도 있습니다 (연대순으로 나타남).
rm -rf **/.Apple*
-delete
하지 않으면 -exec rm -f {} +
대신 사용하십시오.
find
삭제하면서 자세하게 설명 할 수 있습니까 ? "globstar"메소드가 -v
스위치 를 추가하여이 작업을 수행한다고 가정합니다 .
매뉴얼 페이지에 명시된 바와 같이 의도적 인 행동으로 인해 문제 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
xargs
여기 에 사용할 이유가 없습니다 . -exec rm -r {} \;
또는 -exec rm -r {} +
특수 문자 파일 이름을 사용하지 않고도 더 잘 수행 할 수 있습니다. find의 출력을 반복하는 것이 왜 나쁜 습관입니까?를
mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
데이터 손실 가능성이 없다고 생각되면 디렉토리에서 시도한 후 동일한 명령을 다시 실행하십시오. 또는 Mac OS에 관한 질문이므로 mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
. ( 경고 : 이 작업을 수행하면 모든 파일이 삭제됩니다. 내 말이
시험:
shopt -s dotglob # using Bash
printf '%s\n' ./.Apple* # test
#rm -rf ./.Apple*
dotglob
쓸모가 없습니다. dotglob의 기능에 대한 예는 이 페이지 를 참조하십시오 .
간단한 명령 :
rm `find ./ -name '.Apple*'` -rf
행운을 빕니다!
find . -type d -name .Apple*
일할 수있다 -그것은 모든 폴더를 나열합니다. 그러나-delete
끝에 추가하면 실패합니다 . 사용법 요약과 함께 다시 제공됩니다. BusyBox v1.1.1에서 실행 중입니다. 차이가 있습니까?