针对名称略有不同的多个目录运行命令

针对名称略有不同的多个目录运行命令

我想运行一个命令来删除备份,这样我就可以减少磁盘使用量。不知道怎么做,但代表目录*下的所有目录sites

sudo rm -r sites/*/private/backups/*

我的目录结构如下所示:

ls sites 

sites/hello/private/backups/
sites/world/private/backups/
sites/hello_world.txt

这不起作用

答案1

注意:这假设您使用将后缀添加到备份的惯例~。如果您使用其他内容,则需要find相应地更改参数。例如,如果您使用,如果您不使用 之类的内容.bak,则*~应该改为.bak

尝试这个:

第一次运行

sudo find /sites -type f -name '*~' 

并查看输出。如果您愿意删除列表中的文件,请重新输入命令,但将输出通过管道传输rm

sudo find /sites -type f -name '*~' -print0 | xargs -0 /usr/bin/rm

这将导致 shellrm PATHNAME在列表中的每个 PATHNAME 上执行。

*中的字符是bash通配符。它将匹配几乎任何字符的一个或多个实例。此规则最值得注意的例外是字符/,这就是为什么它在您的示例中一次只匹配一个目录。用于**匹配路径名中的任意数量的目录。

编辑:

刚刚注意到,您将目录列为 而sites/...不是/sites/...。您需要确保传递给 的第一个参数find完整路径到目录。否则,它只会返回错误。

编辑2:

当我修复第二个命令时,我意识到它find本身可以完成 rm 正在做的事情,但不需要进行任何额外的调用。这应该可以工作,但我仍然不建议在不先运行顶级版本以查看将删除的内容的情况下执行此操作。命令是

sudo find /sites -type f -name '*~' -delete

最后一条建议是,如果您使用了find很多,并且有系统备份,您会看到输出被重复项所覆盖。如果是这样,请查找该-prune选项。它将使与其相关参数匹配的任何内容不出现在输出中。

相关内容