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

TNT*_*TNT 15 command-line bash rsync find

当我使用

find /home/user/parentdir -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)

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

我想将此保留parentdirrsync一些文件中以进行备份或云计算。处理后,我需要删除空文件夹,但parentdir每次重新创建似乎都无济于事。

parentdir什么建议要保留吗?我想在其中创建一个.nocopy文件并将其从 中排除rsync,但看起来有点矫枉过正。有没有更优雅的方式?

小智 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
Run Code Online (Sandbox Code Playgroud)

当文件很多并且过于复杂时,find /home/user/parentdir/* in AmourK 的答案是不可取的。


小智 15

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

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

  • 还要注意,这不会找到任何以点开头的孩子。总有一天你会意识到这一点,如果你也找到了“.*”,你将陷入一个巨大的伤害世界(因为“.*”匹配“..”)。问我怎么知道。 (12认同)
  • 使用这种方法需要注意的一件事是,如果 `/home/user/parentdir/` 中有 ** 大** 数量的文件,则扩展的 glob 可能会超过 `ARG_MAX`,从而导致 *argument 列表太长* 错误。您可以通过将 glob 更改为 `*/` 使其仅匹配目录来减少发生这种情况的机会。 (7认同)