【问题标题】:How to get echo to print only deleted file paths?如何让 echo 仅打印已删除的文件路径?
【发布时间】:2017-09-19 20:14:33
【问题描述】:

我正在尝试编写一个脚本来每天在一个目录中创建 mysqldumps,并检查该目录中的所有备份并删除将在 cron 上运行的任何超过 7 天的备份。

所以我的功能正常工作,只是我最后一个 echo 命令没有按照我的意愿执行。这是我目前所拥有的:

DBNAME=database
DATE=`date +\%Y-\%m-\%d_\%H\%M`
SQLFILE=$DBNAME-${DATE}.sql
curr_dir=$1

#MAIN
mysqldump -u root -ppassword --databases $DBNAME > $SQLFILE

echo "$SQLFILE has been successfully created."

#Remove files older than 7 days

for filepath in "$curr_dir"*
    do
        find "$filepath" -mtime +7 -type f -delete
        echo "$filepath has been deleted."
    done
exit

因此,创建备份和删除旧文件都有效。但是,我的问题是 echo "$filepath has been deleted." 正在打印目录中的所有文件,而不仅仅是 7 天之前被删除的文件。我哪里错了?

编辑(完整解决方案):

使用来自答案和 cmets 的每个人的建议,这是最终为我工作的完整解决方案。这适用于 cron 作业。我必须指定主函数的输出文件路径,因为这些文件是在根目录中创建的,而不是在参数 $1 中指定的路径。

感谢大家的帮助! if 语句还检查 $1 是否是我要删除文件的指定目录。

#Variables
DBNAME=database
DATE=`date +\%Y-\%m-\%d_\%H\%M`
SQLFILE=$DBNAME-${DATE}.sql
curr_dir=$1

#MAIN
mysqldump -u root -ppassword --databases $DBNAME > /path/to/db-backups/directory/$SQLFILE

echo "$SQLFILE has been successfully created."

#Remove files older than 7 days

for filepath in "$curr_dir"*
    do
        if [[ $1 = "/path/to/db-backups/directory" ]]; then
            find "$filepath" -mtime +7 -type f -delete -exec sh -c 'printf "%s has been deleted.\n" "$@"' _ {} +
        fi
    done
exit

【问题讨论】:

  • 我不知道 bash,但看起来你的 FOR 循环说“如果文件路径超过 7 天,则删除它,然后不管文件是否被删除,说$filepath has been deleted" 您也可以考虑添加某种“if”块或其他东西来限制回声片段。
  • 正确执行@phroureo 建议的一种方法是将-exec echo '{}' "has been deleted" \; 添加到find 命令中,而不是将其放在单独的行中。
  • @phroureo,bash 代码不知道单个删除是否成功——这都是 find 内部的。
  • 我强烈建议在$1 中添加一些健全性检查——至少,确保它已被指定,否则有人可能会忘记它(或在没有意识到需要的情况下运行脚本待指定),并从当前目录中清除超过 7 天的所有内容。
  • @GordonDavisson 我听从了您的建议。几乎学会了艰难的方法,但我所做的是在我的 for 循环中添加一个 if 语句,仅当 $1 等于备份所在的目录时才删除文件。for filepath in "$curr_dir"* do if [[ $1 = "/path/to/mysqldump/backups" ]]; then find "$filepath" -mtime +7 -type f -delete -exec echo '{}' "has been deleted." \; fi done exit

标签: linux bash shell echo


【解决方案1】:

您可以将echo 合并到find

find "$filepath" -mtime +7 -type f -delete -exec echo '{}' "has been deleted." \;

-delete 选项只是-exec rm '{}' \; 的快捷方式,所有-exec 命令都按照您指定的顺序运行。

【讨论】:

  • -exec sh -c 'printf "%s has been deleted.\n" "$@"' _ {} + 效率更高一些,运行尽可能少的外部进程(相对于每个匹配一个 /bin/echo)。
猜你喜欢
  • 2020-12-19
  • 2022-11-28
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多