디렉토리의 내용 만 제거하는 방법?


14

폴더에 있습니다 : /var/myfolder.

내부에는 다음과 같은 다른 폴더가 있습니다 /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/.

각각에는 임의의 이름을 가진 파일이 있습니다. 내부의 모든 폴더에서 모든 파일을 어떻게 제거 /var/myfolder합니까?

구조 (내의 모든 디렉토리, 예를 들어 A, B, C 등 /var/myfolder)는 그대로 유지되어야합니다.

답변:


17

시험:

find /var/myfolder -type f -delete

이것은 / var / myfolder 아래의 모든 일반 파일을 가져 와서 디렉토리 만 남기고 삭제합니다.


솔루션 주셔서 감사합니다. Solaris 9 에서이 작업을 수행하고 있다는 것을 언급 했으므로 find에는 -delete 옵션이 없지만 좋은 출발점입니다.
IroeN

2
다음 해결책을 생각해 낼 수있었습니다. find / var / myfolder -type f -exec rm -f {} \;
IroeN

2
죄송합니다. 데비안이나 우분투를 사용합니다. 귀하의 솔루션은 내가 아는 한 동등합니다.
StarNamer

6
-type f! =! -type d
mikeserv

7

zsh에서는 . glob 한정자 를 사용하여 일반 파일 만 일치 시킵니다 .

rm -- **/*(.)

현재 디렉토리와 하위 디렉토리의 모든 (숨겨지지 않은) 일반 파일을 재귀 적으로 삭제합니다. Dglob 한정자를 추가하여 숨겨진 일반 파일 (및 숨겨진 디렉토리의 일반 파일)도 삭제하십시오.


bash를 사용하고 있습니다.
IroeN

1
@ user6554 ... 어떤 질문도 사용 된 태그도는 표시)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm 디렉토리를 제거하지는 않으므로 모든 디렉토리에서 실행하십시오.

디렉토리에 대한 심볼릭 링크를 유지하려면

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

그리고 위의 버전에서 테스트해야 할 파일이 많은 경우 약간 최적화 된 방식으로 작동해야한다고 생각합니다 .

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

GNU find에는 -xtype옵션이 있습니다.
Stéphane Chazelas

@ StéphaneChazelas-ast도 마찬가지입니다. 그러나 나는 깊이가 전혀 필요하지 않았다고 생각합니다. 나는 많은 오류 호출을 피하기 위해 최상위에 유지했다.
mikeserv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

하위 폴더 자체를 건드리지 않고 하위 폴더 내의 모든 항목을 삭제합니다.

첫 번째는 *의 하위 디렉토리입니다 myfolder자체 ( A, B, ...). 두 번째 *의 파일입니다 A, B

이상의 폴더 안에있는 경우 A, B등을 먼저 실행은 : rm /var/myfolder/*/*/*다음 실행 rm /var/myfolder/*/*.


0

또한 해당 디렉토리 트리의 상단으로 cd 한 다음 다음을 실행해야합니다.

find . -type f -print0 | xargs -0 rm -rf

디렉토리 트리는 그대로두고 모든 파일을 삭제해야합니다. 공백이 포함 된 파일 또는 디렉토리 이름이없는 경우 -print0 및 -0 옵션을 생략 할 수 있습니다.

find 명령은 파일 (-type f)과 링크 (-type l)를 구별하므로 링크가 있으면 그대로 두어야합니다. 그래도 테스트되지 않았습니다. 의심스러운 경우 다음을 실행하십시오.

찾기 . -l 형

이전 find 명령을 실행하기 전에 어떤 것이 나타나는지 확인하십시오.


rm깃발 -r, -R, --recursive - remove directories and their contents recursively이 이것에 어떻게 들어 맞는지 설명 할 수 있습니까 ?
Stephen Rauch

rm -rf를 실행하지 않기 때문에 find를 실행하고 있습니다. -f를 입력 한 다음 출력을 rm -rf로 파이핑합니다. 따라서 파일 만 제거하고 디렉토리를 건드리지 않습니다. 그게 뭐야 | xargs 비트는 왼쪽의 명령에서 출력을 가져 와서 오른쪽의 명령으로 보냅니다.
rjh427

내 요점은 정확히 디렉토리를 전달하지 않으면 디렉토리에서만 작동하는 플래그는 어떤 용도로 사용됩니까?
Stephen Rauch

근육 기억 때문에 여전히 작동합니다. -f "force"옵션에 대해 동일한 이의를 제기 할 수 있습니다. 동일한 답변을 드리겠습니다.
rjh427

-2

아래 명령을 사용하십시오.

sudo rm -rf directory_in_which_you_have_content / *

---------------- 또는 --------------------------------- -----------------------

'*'는 모두를 나타내므로 *를 사용하면 모든 내용이 삭제됩니다. 따라서 이와 같은 명령을 사용하거나 모든 내용을 삭제하려는 디렉토리로 이동하여 아래 명령을 사용하십시오.

sudo rm -rf *

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