파일 내에서 줄을 회전합니다. 맨 위 행을 맨 아래로 이동하고 날짜를 추가하세요.

파일 내에서 줄을 회전합니다. 맨 위 행을 맨 아래로 이동하고 날짜를 추가하세요.

스크립트에서 변경하고 싶은 목록이 있습니다. 스크립트를 실행할 때마다 회전 목록을 얻을 수 있도록 맨 위 항목을 맨 아래로 이동하고 싶습니다. 또한 맨 아래로 이동한 행에 날짜를 추가하고 싶습니다. 따라서. 최상위 폴더는 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및 를 원하는 다른 형식 지정자로 바꿀 수 있습니다.%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. 은 %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

관련 정보