检查文件是否被删除

ccd*_*ies 1 find shell-script files

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

以上工作,但只是想仔细检查我在这里没有做明显错误的事情。

然后我想检查是否找到了任何文件夹,如果它们被删除,是哪些。

我想知道这是否会像下面这样简单来检查是否为真:

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

但是我不确定如何输出被删除的文件夹路径。

Gil*_*il' 5

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

请注意,传递给-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 {} \;
Run Code Online (Sandbox Code Playgroud)

或者,您可以让 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 {} \;
Run Code Online (Sandbox Code Playgroud)

但是,如果没有与模式匹配的文件,或者如果匹配的文件太多以至于它们的组合名称超出了命令行的最大长度,这将导致错误。该-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
Run Code Online (Sandbox Code Playgroud)

如果您担心删除错误的内容,记录您删除的内容只会让您知道为时已晚。您可以先将东西移到“垃圾桶”中,然后再清空垃圾桶,从而进行分阶段删除。

# 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 {} \;
Run Code Online (Sandbox Code Playgroud)