빈 하위 폴더 삭제, 상위 폴더 유지


15

내가 사용할 때

find /home/user/parentdir -type d -empty -delete

내부의 빈 하위 폴더를 재귀 적으로 찾고 /home/user/parentdir삭제합니다. 그러나 /home/user/parentdir비어있는 경우 parentdir폴더도 삭제되므로 바람직하지 않습니다.

나는 이것을 유지하려면 parentdirrsync백업 또는 클라우드로 일부 파일. 처리 후 빈 폴더를 삭제해야하지만 parentdir매번 다시 생성하는 것은 비생산적인 것 같습니다 .

유지할 제안 parentdir? 그 .nocopy안에 파일을 만들고에 대해 제외시키는 것에 대해 생각 rsync했지만 과도하게 보입니다. 더 우아한 방법이 있습니까?


/ parentdir 끝에 슬래시 (/)를 추가하면 (예 : / parentdir /) 차이가 있습니까?
Graham

6
-mindepth 1?
steeldriver

@Graham / parentdir /은 parentdir도 삭제하므로 차이가 없습니다.
TNT

아, @Amourk가 그의 답변에서 언급 한 끝에 *를 놓친 것을 알 수 있습니다.
Graham

답변:


25

간단히하세요 find /home/user/parentdir -mindepth 1 -type d -empty -delete.

보기:

$ mkdir -p test1/test2
$ find test1 -type d
test1
test1/test2
$ find test1 -mindepth 1  -type d
test1/test2

find /home/user/parentdir/* AmourK의 대답은 거기에 많은 파일이 있고이 overcomplicated 때 바람직하지 않다.


15

/*끝에 추가 하면 자체가 parentdir아닌 parentdir의 모든 하위 디렉토리에서 작업을 수행하게 parentdir됩니다. 따라서 동일한 방식으로 /home/user/이전 명령에서 parentdir삭제되지 않고 아래 명령에서 삭제되지 않습니다. *glob 연산자라고하며 모든 문자열과 일치합니다.

find /home/user/parentdir/* -type d -empty -delete


7
이 접근 방식에서 알아야 할 한 가지는 에 파일 수가 많으면/home/user/parentdir/ 확장 된 glob가 초과 ARG_MAX되어 인수 목록이 너무 긴 오류가 발생할 수 있다는 것입니다. glob를 */디렉토리와 만 일치하도록 변경하여 발생 가능성을 줄일 수 있습니다 .
steeldriver

12
또한 점으로 시작하는 어린이는 발견되지 않습니다. 그리고 언젠가이 사실을 깨닫게되며, ". *"를 찾으면 ". *"가 ".."와 일치하기 때문에 큰 상처를 입게됩니다. 내가 어떻게 알아?
Glenn Willen

1
@GlennWillen이 이야기를하기 전에 왜 우리 앞에 술을 마신 바에 앉아 있어야한다고 생각합니까?
Monty Harder

@MontyHarder 다행스럽게도 그다지 나쁘지 않았습니다. 그것은 내 첫 번째 유닉스 시스템에 있었고, 그것은 내 고등학교가 소유 한 Solaris 시스템이었습니다. 나는 'rm'을 실행하지 않고 오히려 'chown'을 실행하고 있음을 감사드립니다. 루트를 사용하여 홈 디렉토리의 모든 소유권을 수정하려고했습니다. 대신 나는 모든 홈 디렉토리 (및 모든 내용)에 대한 소유권을 부여한 다음 다시 제출해야했습니다.
Glenn Willen

소프트웨어를 설치하는 방법에 대해 새로운 직원을 훈련시키는 동료 직원이있었습니다. 그것은가는 포함했다 /tmp, gzip으로 압축 된 타르볼이 풀고, 하위 디렉토리를 생성, 설치 프로그램을 실행하고, 청소. 초보자 rm -rf /tmp/foo-install는 그렇게 할 수있는 올바른 방법 이라고 생각 했으며 숙련 된 손은 최고의 Darth-Vader-E-Episode-III 인상에서 "Noooooo"라고 말한 것처럼 newb는 /와 Enter 키가 서로있었습니다. 백업 소프트웨어의 복원 디스크로 부팅하고 테이프에서 전체 서버를 다시로드해야했습니다.
Monty Harder

0

php-cli가 설치되어 있다면

printf %s $(pwd) | php -r 'function f(string $dir){var_dump($dir);$dir.=DIRECTORY_SEPARATOR;foreach(glob("$dir*",GLOB_ONLYDIR) as $d){f($d);}global $original;if(substr($dir,0,-strlen(DIRECTORY_SEPARATOR))!==$original && empty(glob("$dir*"))){rmdir($dir);}}f(($original=stream_get_contents(STDIN)));'

당신이 원 foreach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());하거나 그에 가까운 것을 원합니다 . $skipped첫 번째 것을 건너 뛰고 @rmdirdir을 제거하려고 시도하고 비어 있지 않으면 자동으로 (@) 실패합니다.
chx

0

하나의 수준 만 필요한 경우 (부모 폴더는 남기고 빈 자식 폴더는 삭제) 쉬운 방법을 사용하는 것 rmdir입니다.

rmdir parent/*

빈 하위 폴더를 모두 삭제하지만 파일 및 비어 있지 않은 폴더에 대해서만 오류를 인쇄합니다.

이것은 재귀 적으로 작동하지 않지만 폴더 구조를 알면 다음과 같은 작업을 수행하는 가장 빠른 방법 일 수 있습니다

rmdir parent/*/*/* # deletes parent/a/b/c when empty
rmdir parent/*/* # deletes parent/a/b when it is now empty
rmdir parent/* # deletes parent/a when it is now empty

장점 : 기억하기 쉽고 빠르게 입력 할 수 있으며 잘못된 매개 변수를 선택할 가능성이 거의 없습니다.
단점 : 유연성이 떨어지고 터미널에 많은 오류 메시지가있을 수 있습니다.

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