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

Я думаю, что Вы ищете pmount.

Если Вы хотите автоматическое монтирование на вставку, посмотрите Автомонтирующиеся карты с интерфейсом USB на Debian.

Если Ваша система использует udisks2, это - предпочтительный способ реагировать на вставку съемного устройства хранения. Посмотрите Дугу Wiki для подсказок по конфигурации для Udisks.

Иначе программа, которая реагирует, когда новое устройство появляется, является udev, таким образом, автоматическое монтирование инициировано правилом udev. usbmount пакет предоставляет правила udev автоматически смонтировать устройства хранения USB и немногих других. Вызов mount от udev правила не работают на файловые системы FUSE (такие как ntfs-3g), так используйте udisks при необходимости в этом.

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

71
17.10.2013, 02:52
9 ответов

Это не работает потому что команда 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
112
27.01.2020, 19:31
  • 1
    +1 - Я всегда использую спецификатор формата для даты, или "%Y%m%d-% H%M%S" или "%y%m%d-% H%M%S". –  ChuckCottrill 17.10.2013, 04:12
  • 2
    Просто touch foo`date +%F` также хорошо работает. –  Vadzim 23.12.2014, 16:28
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 не является подходящим к имени файла, и оно не могло бы даже работать, если локаль использует / символы в выходном формате по умолчанию. Используйте Y-M-D формат даты так, чтобы лексикографический порядок на имена файлов был хронологическим порядком (и также избегать неоднозначности между американскими и международными форматами даты).

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}
13
27.01.2020, 19:31
  • 1
    последний дал мне CP: будьте нацелены 'на нечто.. backup.20160913-134158' не является каталогом –  Kalpesh Soni 13.09.2016, 20:42
  • 2
    @KalpeshSoni точная команда, которую я отправил, не может произвести это сообщение об ошибке. Вы, должно быть, использовали другую команду. –  Gilles 'SO- stop being evil' 13.09.2016, 20:45

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

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
}
5
27.01.2020, 19:31

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

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

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

cp foo.txt foo-`date --iso`.txt
10
27.01.2020, 19:31

Как 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 и re-login/let, Ваш удар перечитал его, необходимо только звонить bk file.txt.

4
27.01.2020, 19:31

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

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

ИЛИ:

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

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

. Вы также можете использовать дополнительные параметры управления ФОРМАТОМ в соответствии с вашими потребностями Например:% H,% M,% S и т. д.

3
27.01.2020, 19:31

В 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, если вы помешаны на точности).


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

  !# Вся набранная на данный момент командная строка.
 

А $ — указатель слова:

  $ Последнее слово. Обычно это последний аргумент, но он расширяется до нулевого слова, если в строке есть только одно слово.
 
1
27.01.2020, 19:31

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

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

ls -l

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

2
27.01.2020, 19:31

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

т.е.

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

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

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

или просто используйте

cp filename{,.20190929}

filename.sh.20190929

Добавьте дату в соответствии с вашими потребностями.:)

0
27.01.2020, 19:31

Теги

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