linux - 如何让 echo 只打印已删除的文件路径?

标签 linux bash shell echo

我正在尝试编写一个脚本来每天在一个目录中创建 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 天前被删除的文件。我哪里出错了?

编辑(完整解决方案):

这是一个完整的解决方案,它使用了每个人从答案和评论中得到的建议,最终为我工作。这适用于 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

最佳答案

您可以将 echo 合并到 find 中:

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

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

关于linux - 如何让 echo 只打印已删除的文件路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46309048/

相关文章:

linux - 使用 bash 编辑文本文件并显示输出

linux - 如何在 shell 脚本中存储 IP 地址?

linux - 虚拟盒子。 Fedora 11 启动时卡住

regex - 日期的 Shell REGEX

linux - 使用 shell 脚本进行数据管理

shell - `for NAME do ...` 中的 NAME 后是否禁止使用分号?

linux - bash 使用 "find"命令并删除用户的模式(使用特殊参数)

c++ - 在多线程c++中捕获进程的输出

linux - grep 在 bash 脚本中失败但在命令行上工作

linux - 用于归档和加密的 Shell 脚本