하나를 제외한 모든 하위 디렉토리 삭제


10

현재 디렉토리 아래에 여러 개의 서브 디렉토리가 있고 하나는 A라고 가정하십시오.

Bash가있는 A를 제외한 모든 하위 디렉토리를 삭제하는 방법은 무엇입니까?

답변:


23

Bash가 globbing을 확장했습니다 (먼저 테스트 한 다음 에코 제거).

shopt -s extglob
echo rm -rf !(A)

(잊어 버리기 전에 CSH 스타일 히스토리 완료를 비활성화 할 수 있습니다. Bash3에는 무시하는 동안 버그가 있습니다! (. set + H

놀라움으로 가득 찬다면 배쉬 +1! 때때로 그들은 이것처럼 멋지다.
Aleksandr Levchuk 1

와우 정말 좋은! 예상대로 작동합니다. 함께 shopt | grep ext플러그인이 활성화되어있는 경우 확인할 수 있습니다.
danger89

14
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

10

이건 어떤가요:

mv A /tmp/
rm * -rf
mv /tmp/A .

이것은 다른 명령에서 오타의 "무서움"을 피합니다.


1
도구가 영리하기를 기대하는 대신 제정신을하기위한 +1 그래도 어느 날 밤, Linux를 배우고있을 때, 첫 번째 재 컴파일을하기 전에 커널을 / tmp에 복사했습니다. 그것은 성공하지 못했지만 오래된 것을 지웠으므로 '땀이 나지 않습니다. 복사본이 있습니다.'자정 cron 작업이 / tmp의 1 주일 이상 된 모든 파일로 지 웠습니다. 나는 다시 컴파일해야했고 이번에는 제대로했거나 재부팅하지 않았습니다!
Javier

최고의 답변 게시 :)
warren

3

같은 것

find . -type d -not -name A -exec rm -ir {} \;

해야 할 것.

편집하다

정말해야합니다

find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;

findA 아래에서 되풀이 되지 않도록


3
그러나 이렇게하면 A / foo 및 A / bar와 같이 A 아래의 하위 디렉토리도 제거되지만 A / A는 유지됩니다.
TCampbell 2016 년

멋있는! 질문과 답변이 SO에서 SF로 이전되었습니다. 그러나 위의 편집 내용이 손실되었습니다 ...
agnul

maxdepth와 type 인수를 다음과 같이 바꾸는 것이 좋습니다 : find. -maxdepth 1 -type d -not -name A -exec rm -ir {} \;
Spawnrider

1

나는 보통 ls 명령을 먼저 처리 하여이 작업을 수행합니다. 나는 유닉스 머신이 아니지만 다음과 같은 것입니다 :

ls -lda "[^ A]"

일단 그것을 얻으면 명령으로 파이프하십시오.

ls -lda "[^ A]"| xargs rm -rf

정규식이 잘못되면 위의 내용을 자유롭게 편집하십시오 ...



1

보다 유연하지만 수동적 인 작업을 수행하려면 다음을 수행하십시오.

ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r

그렇게하면 일반적인 융기를 할 수 있습니다.


1

한 가지 방법이 있습니다. 그러나 이런 종류의 것을 조심하십시오. 매우 강력하여 선과 악에만 사용할 수 있습니다 ...

찾기 *-타입 d | grep -v "^ A"| xargs rm -rf

1

find -print0을 통과하고 xargs에 -0을 전달하지 않고 일부 사람들이 -exec 및 rm로 표시 했으므로 find를 사용하지 마십시오. 공백이나 줄 바꿈이있는 파일 이름과 혼동됩니다.

$ mkdir 'foo foo'
$ mkdir foo$'\n'foo 
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory

대신 xargs -0, '-exec command {} +'와 함께 find -print0을 사용하거나 찾기에서 지원하는 경우 -delete를 사용하십시오.



1

앞의 예 외에도 :

find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;

당신은 또한 할 수 있습니다 :

find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \;

cd some/subdir먼저 하지 않아도됩니다 .

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