当我使用
find /home/user/parentdir -type d -empty -delete
它会递归查找其中的空子文件夹/home/user/parentdir
并将其删除。但如果/home/user/parentdir
也是空的,它parentdir
也会删除该文件夹,这对我来说是不可取的。
我想将其保留parentdir
到rsync
一些文件以进行备份或云存储。处理后,我需要删除空文件夹,但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
优点:容易记住,输入速度快,选择错误参数的可能性很小。
缺点:灵活性较差,终端中可能会出现大量错误消息。