我正在尝试创建一个脚本,但我陷入了要添加的最后部分。
该脚本将我的服务器上的一些路径同步到我的谷歌驱动器。如果我的服务器上有任何已删除或修改的文件,则会将其移动到/old/date/
gdrive 上的路径。
oldlog="/boot/logs/old-log.txt"
del=""
date=$(date +"%Y-%m-%d-%H%M")
--backup-dir "${dest}/old/${date}"
这非常有效,但我必须/old/
手动删除文件,这就是我想要更改的。
所以我需要的是始终$date
写入$oldlog
日志中的第 1 行,并将日志中的所有其他行向下移动一行。写入$date
日志必须与写入日志匹配,$date
因此--backup-dir "${dest}/old/${date}"
它们是相同的。
所以日志需要在xx天1天之后像这样工作
2019-07-01-1800
2天
2019-07-02-1800
2019-07-01-1800
3天
2019-07-03-1800
2019-07-02-1800
2019-07-01-1800
所以对于下一部分。像上面的示例一样更新日志后,我需要从 中获取第 21 行oldlog.txt
,删除该行并将其添加到脚本中作为$del
。
oldlog="/boot/logs/old-log.txt"
del=
rclone purge "${dest}/old/${del}"
现在,如果该行是空的,我需要它只是一个随机文本,这样它就不会清除里面的所有内容/old/
,或者也许我可以采用更高级的方法?类似 if del=empty then 显示消息没有要清除的内容。如果 del=oldlog.txt 中的值,则运行rclone purge "${dest}/old/${del}"
oldlog="/boot/logs/old-log.txt"
del=
delempty=echo "nothing to purge today"
delvalue=rclone purge "${dest}/old/${del}"
这些是否可以在脚本中完成而不变得复杂?
答案1
您想要完成四件事:1)在文件开头插入一行,2)读取文件的特定行,3)如果该特定行不存在则有条件分支,4)删除文件的特定行。
您可以使用流编辑器实用程序sed
来完成所有这些操作。我将在我的答案中假设 GNU sed
,但确切的语法可能与其他版本的sed
.
要将行插入到文件的开头:
sed -i "1i\${date}" ${oldlog}
该-i
选项指示sed
就地处理文件。1
告诉sed
只在第一行进行操作。i\
告诉sed
在该行之前插入。
要检索第 21 行:
del="$(sed -n 21p "${oldlog}")"
-n
仅置于sed
安静模式,因此唯一的输出是显式打印的内容。21
是行号,p
是打印命令。
判断是否有第21行:
sed -n 21q1 ${oldlog}
再次-n
将 sed 置于安静模式,21
选择第 21 行,q
告诉 sed 退出,这1
是退出代码。
删除第21行:
sed -i 21d ${oldlog}
再次,-i
要就地操作文件,21
请选择第 21 行并d
删除该行。
把它们放在一起:
sed -i "1i\${date}" ${oldlog}
del="$(sed -n 21p "${oldlog}")"
sed -n 21q1 ${oldlog} || { echo "Deleting ${dest}/old/${del}" && rclone purge "${dest}/old/${del}" && sed -i 21d ${oldlog} }