패턴과 일치하는 파일이 포함된 모든 폴더 삭제

패턴과 일치하는 파일이 포함된 모든 폴더 삭제

rar 파일이 포함된 현재 작업 디렉터리의 모든 하위 디렉터리를 삭제하려고 합니다.

첫 번째 시도: find -name *.rar -exec rm -r {}/.. ';'유효한 디렉터리가 아니기 때문에 실패했습니다. 좀 더 합리적인 명령을 사용해 보았지만 dirname {}의도하지 않은 내용을 거의 삭제한 후 질문을 하기로 했습니다.

Windows 7에서 Cygwin을 사용하고 있습니다.

답변1

zsh 사용:

rm -rf **/*.rar(:h)

접미사 :h가 적용됩니다역사 확장 수정자 h("head") 각 일치 항목의 기본 이름을 제거하고 디렉터리 부분만 남깁니다.

이 디렉토리가 실제로 삭제하려는 디렉토리인지 확인하십시오! 예를 들어 먼저 임시 디렉터리로 이동합니다.

mkdir DELETE
mv **/*.rar(:h) DELETE/
# check that you really want to delete everything in DELETE
rm -r DELETE

답변2

find를 사용하여 bash -c고급 작업을 수행 할 수 있습니다 -exec. cat과 함께 임시 파일을 사용할 때의 문제점은 xargs파일에 공백, 개행 또는 탭이 포함되어 있으면 중단된다는 것입니다. 다음이 작동합니다.

find . -type f -name '*.rar' -exec bash -c 'rm -rf "${@%/*}"' -- {} +

+"$@"와 함께 찾기를 사용하면 rm를 사용하는 것처럼 한 번 실행 됩니다 xargs.

답변3

한 쌍의 명령문을 사용하여 이를 수행할 수 있습니다.

먼저 다음 명령을 사용하여 삭제할 디렉터리 목록을 가져옵니다.

find -name *.rar -exec dirname {} ';' > toremove

다음으로 cat toremove원하는 폴더가 포함되어 있는지 확인하세요. 그런 다음 전달하여 rm -rf사용 하세요.

sed 's/^/"/g' toremove | sed 's/$/"/g' | xargs rm -r

마지막, rm toremove.

답변4

다음과 같이 시도해 볼 수 있습니다.

for dir in */; do             # iterate all subdirectories
    touch $dir"dummy.rar"     # create a "rar"-file...
    for file in $dir*.rar; do # ...so this won't break on zero such
        rm $file              # remove the dummy, and all archives
    done
done

관련 정보