linux - 如何用名称中的时间戳替换备份文件而不在 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 script 有问题。到目前为止它工作正常(从网站卷曲 ASCII 数据并将其写入 weather.txt.log)。它也在 crontab 中设置为每 5 分钟运行一次。现在我需要备份 /home/of/ 下的 weather.txt,在 /home/of/BACKUP 中使用文件名 weather_<timestamp>.txt。我尝试删除 (rm weather*.txt) /home/of/BACKUP 中的旧时间戳文件,然后在每次运行 cronjob 时复制并重命名该文件。我尝试了管道 cpmv 等等,但不知何故,由于时间戳的原因,当我尝试首先删除文件夹的内容时,文件名不同或根本没有文件名,因此最终产生了许多重复项。我只需要一个 weather.txt 作为 weather_<timestamp>.txt 的备份文件,它每 5 分钟更新一次,实际时间戳位我无法弄清楚。

回答1

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

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(但如果您需要能够从任何地方手动运行 script,则无法保证) .

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

顺便说一句,您可以稍微简化 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 作业中运行 script 并重定向到 /dev/null 以避免您的电子邮件收件箱被未读的输出副本填满。

相似文章

最新文章