повернуть строки внутри файла. Переместите верхнюю строку вниз и добавьте дату

Жесткий диск 10 ГБ, 8 процессоров, 4 ГБ ОЗУ -Эти настройки вполне могут подойти для виртуальной машины Linux, у меня были виртуальные машины меньшего размера и гораздо большего размера (на аппаратном обеспечении серверного уровня ).

Требуемые ресурсы сильно зависят от того, что должен делать сервер, однако запрошенные ресурсы, вероятно, не подходят для используемой вами (главной )машины/компьютера.

Вы делитесь/«воруете» ресурсы, которые хост не использует для передачи виртуальной машине; нельзя украсть то, чего нет; чтобы предоставить виртуальные процессоры, дисковое пространство и оперативную память виртуальной машине в Virtualbox, у вас должны быть физические (свободные )ресурсы, соответствующие (хост-компьютеру ), который вы используете.

Если у вас есть только 4 ГБ или даже 8 ГБ физической оперативной памяти, ОС также потребуется хороший кусок для правильной работы, и она не позволит вам использовать всю оперативную память для VirtualBox; тот же комментарий относится примерно к вашим процессорам.

Я советую создать виртуальную машину, ограниченную вашим аппаратным обеспечением, и пояснить в отчете, почему вы не смогли/почему нет смысла создавать требуемые ресурсы. Это, вероятно, принесет вам несколько очков, показывающих, что вы поняли проблему и все же смогли создать виртуальную машину.

1
25.07.2019, 23:56
4 ответа

Вы можете быстро сделать это в 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

При этом весь файл помещается в память. Если файл большой, это может быть медленным.

0
27.01.2020, 23:30

Немного сложно получить правильное экранирование в строке формата 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(print )наwq(write -quit ). Конечно, вы можете заменить %xи %Xдругими спецификаторами формата по вашему выбору.

2
27.01.2020, 23:30
$ 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
0
27.01.2020, 23:30
$ 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:%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. Это выделит первый столбец с разделителями пробелами -в первой строке, но не всю первую строку со старой датой и временем.

0
27.01.2020, 23:30

Теги

Похожие вопросы