按文件名删除所有文件(Linux 单行命令)

按文件名删除所有文件(Linux 单行命令)

CakePHP 有一个惯例,就是将名为“empty”的文件放在空目录中。我相信他们这样做是有原因的,但这确实让我很烦。(是的,强迫症,我知道……)

我想要一个一行的 Linux Shell 命令,它将删除每个子目录中名为“empty”的每个文件。(我认为能够指定通配符以供更广泛使用也很有用。)

有任何想法吗?

答案1

最简单的是:

查找 . -name empty -type f -exec rm -f {} \;

“。”从当前目录开始,如果要在其他位置执行,请用目录路径替换。

“-type f”只是确保它是一个文件。

答案2

简短的摘要:

有多种选择:

find . -name empty -type f -exec rm -f {} \;

rm将对每个文件调用一次

find . -name empty -type f -exec rm -f {} +

rm通过构造使用最大可能长度的命令行,仅在必要时调用

find . -name empty -type f | xargs rm -f

与上述相同,您可能会(或者更确切地说,如上所述 - 这是我的方法)遇到包含需要引用的字符的文件名的问题

find -name empty -type f -print0 | xargs -0 rm -f

可能是最好的解决方案请为 Dan C 的评论点赞,这是他的解决方案。它将像前面的代码片段一样,rm通过构造使用最大长度的命令行来仅在需要时调用,开关-0意味着rm命令的参数将以 分隔,\0以便在 shell 中正确完成转义。

关于使用限制的注释的附注,-type f您也可以使用-size 0(恰好 0 字节)进行限制,我无法验证 CakePHP 是否真的遵守该约定,但几乎我所知道的每个使用占位符文件将空目录签入源存储库的项目都是这样做的。

此外,正如 Matt Simons 指出的那样,添加一个-v标志可能是查看一些进展的一个不错的选择,但请注意,这肯定会减慢整个过程。更好的方法可能是通过使用来跟踪该过程strace -p $pid_of_xargs(如果您想跟踪子进程,请添加其他选项,据我所知这是可能的)

我刚刚在手册页中发现的另一条注释:

find -name empty -type f -delete

毕竟 find 有所有这些内置功能 :)

答案3

cakePHP 可能这样做的一个原因是某些版本控制系统(例如 Mercurial 和 Git)无法跟踪空目录。

答案4

这可能会做:

rm -f $(find /var/www -name empty -print)

默认情况下,查找会递归。

相关内容