我正在使用 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
但随后我不确定如何输出已删除的文件夹路径。
答案1
find
无论是否找到文件都会成功退出。其成功的定义是命令行参数有效并且没有输入/输出错误。如果您想知道它是否找到了某些文件,请让它打印一些内容并检查输出是否非空。
如果要find
打印找到的文件的名称,请-print
作为操作插入。您可以链接多个操作(例如-print
,-exec
只需-prune
将它们一个接一个地放置即可)。
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]' -print -exec rm -rf {} \; -prune
请注意,您需要在传递给 的模式周围加上引号-name
。否则,如果当前目录中碰巧有匹配的文件,shell 将在find
看到它之前扩展该模式。
如果您想打印每个已删除文件的名称,而不仅仅是每个备份的顶级目录的名称,并且您使用的是 Linux(更准确地说,如果您使用的是 GNU coreutils),则可以将该-v
标志传递给rm
.
请注意,您发布的命令会递归地查找所有位置的匹配目录/path/to/files
,而不仅仅是在顶层。我不确定这是否是您的意图;例如,它会查看最近的备份。如果只想匹配顶级目录,最简单的方法就是通过-maxdepth 1
,然后就不需要了-prune
。
find /path/to/files -maxdepth 1 -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \;
或者,您可以让 shell 匹配目录名称,并find
通过在匹配之前应用来告诉永远不要递归任何内容-prune
。
find /path/to/files/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -prune -type d -mtime +2 -print -exec rm -rf {} \;
但是,如果没有与该模式匹配的文件,或者如果匹配文件太多以至于它们的组合名称超出了命令行的最大长度,这将导致错误。该-maxdepth
方法不存在这些缺陷。
如果您想记录哪些文件被删除,请将输出重定向到一个文件。
{
echo "# Deletions on $(date)"
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]' -print -exec rm -rf {} \; -prune
echo
} >>backup-deletions.log
如果您担心删除错误的内容,那么记录您删除的内容只会在为时已晚时让您知道。您可以通过首先将内容移入“垃圾箱”,然后清空垃圾箱来进行分阶段删除。
# Move things to trash. Use whatever criteria you want.
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 mv {} /path/to/trash \; -prune
# Delete directories from the trash can if they were moved more than
# a week ago.
find /path/to/trash -mindepth 1 -maxdepth 1 -ctime +7 -exec rm -rf {} \;