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


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.