如何用名称中的时间戳替换备份文件而不在 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 时复制并重命名该文件。
我尝试了管道 cp
和 mv
等等,但不知何故,由于时间戳,当我首先尝试删除文件夹的内容时,文件名不同或根本没有.
我只需要一个 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
允许您重命名要复制到的文件;分别 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
(尽管如果您需要能够从任何地方手动 运行 脚本,这不能保证。
显然,请确保通配符不匹配您实际想要保留的任何文件。
顺便说一句,您可以稍微简化 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
的脚本,以避免你的电子邮件收件箱填满输出的未读副本。
#!/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 时复制并重命名该文件。
我尝试了管道 cp
和 mv
等等,但不知何故,由于时间戳,当我首先尝试删除文件夹的内容时,文件名不同或根本没有.
我只需要一个 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
允许您重命名要复制到的文件;分别 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
(尽管如果您需要能够从任何地方手动 运行 脚本,这不能保证。
显然,请确保通配符不匹配您实际想要保留的任何文件。
顺便说一句,您可以稍微简化 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
的脚本,以避免你的电子邮件收件箱填满输出的未读副本。