如何用名称中的时间戳替换备份文件而不在 Linux Bash(shell 脚本中产生重复项)

How to replace backup file with timestamp in its name without producing duplicates in Linux Bash (shell script)

#!/usr/bin/env bash

# usage: wttr [location], e.g. wttr Berlin, wttr New\ York

# Standard location if no parameters were passed
location=''
language=''
time=`date`
# Expand terminal display


if [ -z "$language" ]; then
  language=${LANG%_*}
fi

curl \
     -H -x "Accept-Language: ${language}" \
     -x wttr.in/"${1:-${location}}" |
head -n 7 |
tee /home/of/weather.txt |
tee -a /home/of/weather.log |
tee /home/of/BACKUP/weather_"$time".txt

#cp weather.txt /home/of/BACKUP
#mv -f /home/of/BACKUP/weather.txt /home/of/BACKUP/weather_"$time".txt

我是 Linux Bash 和 Shell 脚本编写的新手,无法理解以下内容。 我对上面的 shell 脚本有疑问。 到目前为止它工作正常(从网站卷曲 ASCII 数据并将其写入 weather.txt.log)。 它也在 crontab 中设置为每 5 分钟 运行。 现在我需要在 /home/of/ 下备份 weather.txt,在 /home/of/BACKUP 中使用文件名 weather_<timestamp>.txt。 我试图删除 (rm weather*.txt) /home/of/BACKUP 中带有时间戳的旧文件,然后在每次 cronjob 运行ning 时复制并重命名该文件。 我尝试了管道 cpmv 等等,但不知何故,由于时间戳,当我首先尝试删除文件夹的内容时,文件名不同或根本没有. 我只需要一个 weather.txt 作为 weather_<timestamp>.txt 的备份文件,它每 5 分钟更新一次,其中包含我无法弄清楚的实际时间戳位。

如果我完全理解你的问题,那么简单

rm -f /home/of/BACKUP/weather_*.txt
cp /home/of/weather.txt /home/of/BACKUP/weather_"$time".txt

cp 允许您重命名要复制到的文件;分别 cpmv.

没有意义

为方便起见,您可能需要 cd /home/of 这样您就不必拼出完整路径或将它们放入变量中。

dir=/home/of
rm -f "$dir"/BACKUP/weather_*.txt
cp "$dir"/weather.txt "$dir"/BACKUP/weather_"$time".txt

如果您 运行 退出名为 of 的用户的 cron,那么您当前的工作目录将为 /home/of(尽管如果您需要能够从任何地方手动 运行 脚本,这不能保证。

显然,请确保通配符不匹配您实际想要保留的任何文件。

顺便说一句,您可以稍微简化 tee 命令。如果这应该只更新文件而不向终端打印任何内容,您甚至可以使用

curl \
     -H -x "Accept-Language: ${language}" \
     -x wttr.in/"${1:-${location}}" |
head -n 7 |
tee /home/of/weather.txt \
    >>/home/of/weather.log

我把tee取出来备份了,反正你马上就删了。您也可以先清空备份目录,但如果 curl 失败,您将没有备份。

如果你也想继续打印到终端,可能 运行 在 cron 作业中重定向到 /dev/null 的脚本,以避免你的电子邮件收件箱填满输出的未读副本。