旋转文件内的行。将顶行移至底部并添加日期

旋转文件内的行。将顶行移至底部并添加日期

我有一个要从脚本更改的列表。我想将顶部条目移至底部,以便每次运行脚本时都会得到一个旋转列表。我还想将日期附加到移动到底部的行。由此。顶部文件夹也将用于使用 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(写入退出)。当然,您可以将%xand替换为您选择的其他格式说明符。%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:%Sdate

然后的输出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

相关内容