我正在使用 bash 和 rsync 来创建和存储我的网站的备份。我将这些存储在“ dd-mm-yyyy
”的日期文件夹中。
如果这些文件夹超过 x 天(目前是 2 天,但会更长),我一直在尝试以下方法来删除这些文件夹。
find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune
上面的工作,但只是想仔细检查我在这里没有做明显错误的事情。
然后我想检查是否找到任何文件夹,如果它们被删除,哪些是。
我想知道这是否会像下面这样简单来检查是否为真:
if find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune; then
...
fi
但是我不确定如何输出被删除的文件夹路径。
find
无论是否找到文件都成功退出。它对成功的定义是命令行参数有效并且没有输入/输出错误。如果你想知道它是否找到了一些文件,让它打印一些东西并检查输出是否为非空。如果要
find
打印它找到的文件的名称,请-print
作为操作插入。您可以链接多个动作(例如-print
,将它们一个接一个地放置)-exec
。-prune
请注意,您需要在传递给的模式周围加上引号
-name
。否则,如果当前目录中恰好有匹配的文件,shell 将在find
看到它之前扩展该模式。如果您想打印每个已删除文件的名称,而不仅仅是每个备份的顶级目录的名称,并且您使用的是 Linux(更准确地说,如果您使用的是 GNU coreutils),您可以将
-v
标志传递给rm
.请注意,您发布的命令在
/path/to/files
递归下到处查找匹配的目录,而不仅仅是在顶层。我不确定这是否是您的意图;例如,它会查看最近的备份。如果只想匹配顶级目录,最简单的方法是通过-maxdepth 1
,然后就不需要-prune
.或者,您可以让 shell 匹配目录名称,并通过在匹配之前
find
应用来告诉永远不要递归任何东西-prune
。但是,如果没有匹配该模式的文件,或者匹配的文件太多以至于它们的组合名称超出了命令行的最大长度,这将导致错误。该
-maxdepth
方法没有这些缺陷。如果要记录哪些文件被删除,请将输出重定向到文件。
如果您担心删除错误的内容,那么记录您删除的内容只会让您知道为时已晚。您可以先将物品移入“垃圾桶”,然后再清空垃圾桶,从而进行分阶段删除。