我有一个要从脚本更改的列表。我想将顶部条目移至底部,以便每次运行脚本时都会得到一个旋转列表。我还想将日期附加到移动到底部的行。由此。顶部文件夹也将用于使用 rclone 存储旧备份。
old1
old2
old3
对此
old2
old3
old1 date time
我找到了一个尝试使用的代码,但它不会移动顶部条目,只需将其复制到底部,这样我就会得到这样的输出
old1
old2
old3
old1 date time
old1 date time
我尝试过的代码# Rotate the BACKUPLIST-file, deleting the top entry and adding a new entry at the bottom
OLDEST=$(head -1 $BACKUPLIST | sed 's/ .*//') # The oldest, extra backup-version COUNT=$(cat $BACKUPLIST | wc -l) # Number of files in list
((COUNT=$COUNT-1)) tail -$COUNT $BACKUPLIST > $BACKUPLIST.tmp echo $OLDEST $(date) >> $BACKUPLIST.tmp # Add a new line to the bottom, including today's date
答案1
在格式字符串中获得正确的转义有点棘手date
,但给定
$ cat file
old1
old2
old3
然后
$ cat << 'EOF' | ed -s file
1m$
r !date +\ \%x\ \%X
.-1,.j
,p
EOF
old2
old3
old1 2019-07-25 05:42:32 PM
或(作为单行)
printf '%s\n' '1m$' 'r !date +\ \%x\ \%X' '.-1,.j' ',p' | ed -s file
要就地编辑文件,请将p
(打印)替换为wq
(写入退出)。当然,您可以将%x
and替换为您选择的其他格式说明符。%X
答案2
$ date +"$(head -n 1 file) %F %T" >>file; sed -i 1d file
$ cat file
old2
old3
old1 2019-07-25 23:39:51
$ date +"$(head -n 1 file) %F %T" >>file; sed -i 1d file
$ cat file
old3
old1 2019-07-25 23:47:10
old2 2019-07-25 23:47:22
这会将 的第一行file
作为字符串插入到 的输出格式中date
。 The%F
是 的简写%Y-%m-%d
,并且是大多数实现中%T
的简写。%H:%M:%S
date
然后的输出date
被附加到 的末尾file
。
附加新数据后,sed
用于删除旧的第一行(使用就地编辑)。某些sed
实现必须被调用为sed -i '' 1d file
(参见如何使用 sed -i (就地编辑)实现可移植性?)。
第四次运行上述命令将产生
$ date +"$(head -n 1 file) %F %T" >>file; sed -i 1d file
$ cat file
old2 2019-07-25 23:47:22
old3 2019-07-25 23:51:22
old1 2019-07-25 23:47:10 2019-07-25 23:51:24
如果不需要这样,请使用类似的东西
awk '{ print $1; exit }'
代替head -n 1
.这将挑选出第一个以空格分隔的柱子在第一行,但不是带有旧日期和时间的完整第一行。
答案3
您可以在 bash 中快速完成此操作:
mapfile -t lines < file
printf "%s\n" "${lines[@]:1}" "${lines[0]} $(date "+%F %T")" > file
将其放入函数中:
rotate_file() {
[[ -w "$1" ]] || return 1
local -a lines
mapfile -t lines < "$1"
printf "%s\n" "${lines[@]:1}" "${lines[0]} $(date "+%F %T")" > "$1"
}
演示:
$ cat file
1
2
3
$ rotate_file file
$ cat file
2
3
1 2019-07-25 17:16:51
$ rotate_file file
$ cat file
3
1 2019-07-25 17:16:51
2 2019-07-25 17:16:57
这会将整个文件放入内存中。如果文件很大,速度可能会很慢。
答案4
$ hd="$(head -1 file)"; tail +2 file; printf '%s %s\n' "$hd" "$(date)"
old2
old3
old1 Thu, Jul 25, 2019 4:27:15 PM
$ hd="$(head -1 file)"; { tail +2 file; printf '%s %s\n' "$hd" "$(date)"; } > tmp && mv tmp file; cat file
old2
old3
old1 Thu, Jul 25, 2019 4:28:44 PM
$ hd="$(head -1 file)"; { tail +2 file; printf '%s %s\n' "$hd" "$(date)"; } > tmp && mv tmp file; cat file
old3
old1 Thu, Jul 25, 2019 4:28:44 PM
old2 Thu, Jul 25, 2019 4:28:46 PM
$ hd="$(head -1 file)"; { tail +2 file; printf '%s %s\n' "$hd" "$(date)"; } > tmp && mv tmp file; cat file
old1 Thu, Jul 25, 2019 4:28:44 PM
old2 Thu, Jul 25, 2019 4:28:46 PM
old3 Thu, Jul 25, 2019 4:28:48 PM