빈 하위 폴더 삭제, 상위 폴더 유지 때 find /home/user/parentdir -type d -empty

내가 사용할 때

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

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

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

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



답변

간단히하세요 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 때 바람직하지 않다.


답변

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

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


답변

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)));'

답변

하나의 수준 만 필요한 경우 (부모 폴더는 남기고 빈 자식 폴더는 삭제) 쉬운 방법을 사용하는 것 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

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