删除空的子文件夹,保留父文件夹

删除空的子文件夹,保留父文件夹

当我使用

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

它会递归查找其中的空子文件夹/home/user/parentdir并将其删除。但如果/home/user/parentdir也是空的,它parentdir也会删除该文件夹,这对我来说是不可取的。

我想将其保留parentdirrsync一些文件以进行备份或云存储。处理后,我需要删除空文件夹,但parentdir每次重新创建似乎毫无意义。

有什么建议可以保留parentdir吗?我考虑过.nocopy在其中创建一个文件并将其排除在外rsync,但看起来有点过头了。有没有更优雅的方法?

答案1

只需这样做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 的回答中当文件很多并且过于复杂时这是不可取的。

答案2

通过添加/*到 的末尾parentdir,您将对 parentdir 的所有子目录执行操作,而不是对其parentdir本身执行操作。因此,以同样的方式/home/user/,在旧命令中不会被删除,parentdir在下面的命令中也不会被删除。 *称为 glob 运算符,它匹配任何字符串。

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

答案3

如果你安装了 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)));'

答案4

当您只需要一个级别(保留父文件夹,但删除空的子文件夹)时,一个简单的技巧是使用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

优点:容易记住,输入速度快,选择错误参数的可能性很小。
缺点:灵活性较差,终端中可能会出现大量错误消息。

相关内容