#!/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 时复制并重命名该文件。我尝试了管道 cp
和 mv
等等,但不知何故,由于时间戳的原因,当我尝试首先删除文件夹的内容时,文件名不同或根本没有文件名,因此最终产生了许多重复项。我只需要一个 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
允许您重命名要复制到的文件;将 cp
和 mv
分开是没有意义的。
为方便起见,您可能需要 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
以避免您的电子邮件收件箱被未读的输出副本填满。