하위 디렉토리와 파일을 재귀 적으로 제거하지만 첫 번째 상위 디렉토리는 어떻게 제거합니까?


14

다음을 사용하여 대상 디렉토리와 모든 하위 디렉토리 및 내용을 재귀 적으로 제거 할 수 있습니다.

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

그러나 대상 디렉토리를 제거하고 싶지 않습니다. 대상, 하위 디렉토리 및 해당 컨텐츠의 파일 만 제거하려면 어떻게해야합니까?

답변:


12

이전 답변은 거의 정확합니다. 그러나 쉘 글로브 문자를 사용하려면 인용구를 인용해서는 안됩니다 . 따라서 이것은 당신이 찾고있는 명령입니다.

rm -rf "/target/directory with spaces/"*

*는 큰 따옴표 외부에 있습니다. 이 양식은 다음과 같이 작동합니다.

rm -rf /target/directory\ with\ spaces/*

*위에 표시된대로 따옴표 가 있으면 *대상 디렉토리 내에 문자 그대로 명명 된 단일 파일 만 제거하려고 시도합니다 .


1
숨겨진 파일 및 폴더에서는 작동하지 않습니다. 나는 그것을 다시 한 번해야했다
The Unfun Cat

8

세 가지 옵션이 더 있습니다.

  1. 사용 find-mindepth 1-delete:

    −mindepth 레벨
    레벨 (음이 아닌 정수)보다 낮은 레벨에서 테스트 또는 조치를 적용하지 마십시오.
    −mindepth 1은 명령 행 인수를 제외한 모든 파일을 처리 함을 의미합니다.

    -
    삭제 파일을 삭제합니다. 제거에 성공하면 true입니다. 제거에 실패하면 오류 메시지가 발행됩니다. -delete가 실패하면 find의 종료 상태는 0이 아닙니다 (결국 종료 될 때). −delete를 사용하면 −depth 옵션이 자동으로 켜집니다.
    이 옵션을 사용하기 전에 -depth 옵션을 사용하여 신중하게 테스트하십시오.

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. find디렉토리가 아닌 파일을 사용하십시오 . 이렇게하면 다음을 수행 할 필요가 없습니다 rm -rf.

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. 상위 디렉토리를 제거하고 다시 작성하십시오. 하나의 명령으로 bash 함수를 만들 수 있습니다. 다음은 간단한 단일 라이너입니다.

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

어때요?

rm -rf /target/directory\ path/*

로 시작하는 파일이있을 수 있습니다. 대상 디렉토리에

rm -rf "/target/directory path/*" "/target/directory path/.??*"

이 초는를 제외하고로 시작하는 모든 항목과 일치합니다. 그리고 .. 그것은 .a와 같은 이름에서 실패 할 것이지만, 흔하지는 않습니다. 필요한 경우 모든 경우를 다루기 위해 조정할 수 있습니다.


나는 둘 다 시도했지만 그들은 나를 위해 작동하지 않습니다. 아마도 내 대상 디렉토리 경로에 공백이 있기 때문일 수 있습니다. rm -rf '/ target / directory path / *'오류는 없지만 서브 디렉토리는 남아 있습니다.
Michael Prescott

공백 앞에 백 슬래시 (\)를 사용하거나 전체 디렉토리 이름을 따옴표 ( ")로
묶어

고마워, 나는 나의 이전 의견에서 보듯이 시도했지만 여전히 가지 않았다. (저는 OS X를 사용하고 있습니까?)
Michael Prescott

OS X가 제대로 작동해야합니다. 백 슬래시와 따옴표를 모두 사용하지 않아야합니다. 오직 하나만.
KeithB

예, 따옴표 만 사용하십시오. *를 제거하여 rm -rf "/ target / directory path /"만 사용하는 경우 "directory path"디렉토리는 "directory path"하위 디렉토리와 함께 제거됩니다. rm -rf "/ target / directory path / *"를 사용하면 아무 일도 일어나지 않습니다.
Michael Prescott

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.