Как добавить дату в файл резервной копии


70

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

Как бы вы вставили текущую дату в команду копирования?

[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory

Ответы:


109

Это не работает, потому что команда dateвозвращает строку с пробелами.

$ date
Wed Oct 16 19:20:51 EDT 2013

Если вы действительно хотите, чтобы имена файлов были такими, вам нужно заключить эту строку в кавычки.

$ touch "foo.backup.$(date)"

$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013

Вы, вероятно, думаете о другой строке, которая будет добавлена, но я думаю. Я обычно использую что-то вроде этого:

$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25

См. Справочную страницу для даты для большего количества кодов форматирования вокруг вывода для даты и времени.

Дополнительные форматы

Если вы хотите получить полный контроль, если вы обратитесь к странице руководства, вы можете сделать что-то вроде этого:

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

ПРИМЕЧАНИЕ: вы можете использовать date -Iили date --iso-8601который будет производить идентичный вывод для date +"%Y-%m-%d. Этот переключатель также может принимать аргументы для указания различных форматов времени :

$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601’
Valid arguments are:
  - ‘hours’
  - ‘minutes’
  - ‘date’
  - ‘seconds’
  - ‘ns’
Try 'date --help' for more information.

Примеры:

$ date -Ihours
2019-10-25T01+0000

$ date -Iminutes
2019-10-25T01:21+0000

$ date -Iseconds
2019-10-25T01:21:33+0000

1
+1 - я всегда использую спецификатор формата для даты: «% Y% m% d-% H% M% S» или «% y% m% d-% H% M% S».
— ChuckCottrill

Просто touch foo`date +%F`тоже отлично работает.
— Вадим

предостережение: это не работает в cshоболочке
— Говинда Сахаре

1
@GovindaSakhare - csh / tcsh переключает обозначение подоболочки на backticks ( ...) вместо $(..). Оболочки С, по-видимому, не поддерживают это обозначение для подоболочек.
— SLM

date +"%Y-%m-%d"так же, как date -I. В любом случае, я рекомендую ISO форматы. Точность может быть указана путем добавления часов, минут, секунд или нс к параметру -I. Пример date -Iseconds.
— До Шефера

13
cp foo.txt {,.backup.`date`}

Это расширяется до чего-то вроде cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. Пробел перед фигурными скобками начинается с нового слова.

cp foo.txt {,.backup. $((date)) }

Скобки в отдельных словах, поэтому они интерпретируются буквально. Кроме того, $((…))это синтаксис для арифметического расширения; вывод dateне имеет ничего общего с арифметическим выражением. Подстановка команд использует один набор скобок: $(date).

cp foo.txt foo.backup.`date`

Ближе. Вы могли бы выразить это в скобках как cp foo.{txt,.backup.`date`}. По-прежнему существует проблема, заключающаяся в том, что выходные данные dateсодержат пробелы, поэтому их необходимо заключать в двойные кавычки. Это будет работать:

cp foo.{txt,backup."`date`"}

или же

cp foo.{txt,backup."$(date)"}

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

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

последний дал мне cp: target `foo..backup.20160913-134158 'не является каталогом
— Kalpesh Soni

@KalpeshSoni Точная команда, которую я отправил, не может выдать это сообщение об ошибке. Вы должны были использовать другую команду.
— Жиль "ТАК ... перестать быть злым"

10

Если вы действительно хотите использовать подробную дату, вы должны защитить обратную галочку. С этим форматом даты является то, что он имеет встроенные пробелы, нет-нет в оболочке Unix, если вы не помещаете их в кавычки (или не экранируете их другим способом).

cp foo.txt "foo-`date`.txt"

Однако я предпочитаю использовать более короткий формат ISO:

cp foo.txt foo-`date --iso`.txt

5

Используйте функцию, она облегчит вашу жизнь. Это то, что я использую:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

4

Как dateпо умолчанию в выводе есть пробелы, ваша последняя команда не выполнена. Если вы процитировали последний аргумент внутри ", он должен работать. Ваши другие попытки имеют просто неправильный синтаксис

Здесь возможное решение без пробелов:

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

или же

cp foo.txt foo.backup.`date --iso-8601=seconds`

Если вы добавите

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

на ваш .bashrcи заново войдите / пусть ваш bash перечитает его, вам нужно просто позвонить bk file.txt.


В моем руководстве по дате RHEL переключатель не --iso-8601указан, поэтому я разместил ссылку здесь. Варианты даты GNU: --iso-8601
— Иван Чау

3

Вы копируете файл в файл резервной копии, имя которого создается с добавленной отметкой времени

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

ИЛИ ЖЕ:

Вы можете отобразить содержимое файла с помощью «cat» и перенаправить вывод в файл резервной копии, имя которого создается с добавленной отметкой времени

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

Вы также можете использовать дополнительные параметры управления FORMAT в соответствии с вашими потребностями, например:% H,% M,% S и т. Д.


В чем преимущество catперенаправления cp?
— Гвидо

Это просто альтернативный способ сделать это
— Atul Rokade

2

Когда мне нужно сделать резервную копию файла, я обычно делаю это таким образом.

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
Это ничего не добавляет, что другие ответы еще не были подняты. Кроме того, %Fформат даты производит двухзначные месяцы и ls -lобычно дает чуть больше информации, чем просто имена файлов.
— Кусалананда

1

В bash вы можете ввести:

cp /path/to/long/filename !#$_$(date +Is)

Который расширяется до:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

В результате чего:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

Говяжье существо date -Is. Мне нравится его использовать, потому что он легко запоминается, печатается и допускает короткие версии (например, -Inесли вы преклонный человек).


! запускает указатель события:

 !#     The entire command line typed so far.

И $это слово обозначение:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

0

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

т.е.

cp filename.sh{,."`date`"}

что приводит к

filename.sh.Sun 29 Sep 00:44:43 BST 2019

или просто использовать

cp filename{,.20190929}

filename.sh.20190929

Добавьте дату, чтобы удовлетворить ваши потребности. :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.