将文件夹名称 ($date) 添加到日志顶部,然后从同一日志中剪切第 21 行并添加为运行脚本中的值

将文件夹名称 ($date) 添加到日志顶部,然后从同一日志中剪切第 21 行并添加为运行脚本中的值

我正在尝试创建一个脚本,但我陷入了要添加的最后部分。

该脚本将我的服务器上的一些路径同步到我的谷歌驱动器。如果我的服务器上有任何已删除或修改的文件,则会将其移动到/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} }

相关内容