디렉토리가 아닌 모든 파일을 제거하는 명령은 무엇입니까?


23

다음과 같은 디렉토리 트리가 있다고 가정 해 봅시다.

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

를 사용하면 rm -r FOLDER/*하위 디렉토리를 포함하여 FOLDER의 모든 항목이 삭제됩니다. 실제 디렉토리를 삭제하지 않고 FOLDER 및 하위 디렉토리의 모든 파일을 어떻게 삭제할 수 있습니까?

답변:


37

당신이하려는 것은 재귀 삭제입니다. 이를 위해서는와 같은 재귀 도구가 필요합니다 find.

find FOLDER -type f -delete

13

bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

여기서 glob 확장 파일 이름을 반복하고 파일 만 제거합니다.

위의 내용은 드라 이런이며 변경 사항에 만족하면 echo실제 제거를 위해 제거하십시오.

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

마지막으로 unset globstar:

shopt -u globstar

을 사용 zsh하여 glob 한정자를 활용하십시오.

echo -- FOLDER/**/*(.)

(.) glob 한정자이므로 glob 확장은 일반 파일로만 제한됩니다.

위의 파일은 실제 제거를 위해 파일 이름 만 인쇄합니다.

rm -- FOLDER/**/*(.)

2
zsh globbing의 경우 +1 더 많은 사람들이 zsh가 할 수있는 멋진 일을 알고 있어야합니다.
marcelm

11

의 버전이 find지원되지 않는 -delete경우 다음을 사용하여 현재 디렉토리와 아래의 모든 파일을 삭제할 수 있습니다.

find . ! -type d -exec rm '{}' \;

-exec rm {} +특히 파일이 많은 경우 더 빠릅니다.
muru

그리고 find . ! -type d -exec rm {} +제거합니다뿐만 아니라 링크를 SYM.
Monica에 대한 정의

1
@muru : 특정 구현이 find지원 -delete하지 않으면 아마도 -exec ... {} +어느 것도 지원하지 않습니다 . 이를 처리하기 위해 권장되는 방법은 find ... -print0 | xargs -r0 rm(많은 잠재적 인 일치를 예상하는 경우)입니다.
David Foerster

5
@DavidFoerster는 실제로는 아닙니다. -exec ... {} +POSIX이지만 -delete그렇지 않습니다. (그런데도 마찬가지입니다 -print0.)
muru

@muru : 충분히 공평합니다. find지원 -print0하지만 지원 하지 않는 POSIX 이외의 구현을 두 번 이상 경험했습니다 -exec ... {} +(생각하지는 않습니다 -delete). 하나는 OS X에 있고 다른 하나는 Solaris (몇 년 전 매우 보수적으로 업데이트 된 시스템)에있었습니다. 또한 대체 할 수 있습니다 -print0-printf '%p\0'. 어쨌든 이것은 Unix & Linux가 아닌 Ask Ubuntu 이며 Ubuntu는 영원히 GNU find를 사용합니다.
David Foerster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.