Як додати дату до резервного файлу


69

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

Як би ви ввели поточну дату в команду копіювання?

[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

Відповіді:


108

Це не працює, оскільки команда 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

+1 - я завжди використовую специфікатор формату для дати, або "% Y% m% d-% H% M% S", або "% y% m% d-% H% M% S".
ChuckCottrill

Так touch foo`date +%F`само добре працює.
Вадим

застереження: Це не працює в cshоболонці
Говінда Сахаре

1
@GovindaSakhare - csh / tcsh перемикає нотацію нижньої оболонки на backtikks ( ...) замість $(..). Оболонки C, очевидно, не підтримують це позначення для передплаток.
slm

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і повторно ввійти / нехай ваш баш перечитає його, вам потрібно просто зателефонувати 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?
Гвідо

Це просто альтернативний спосіб
Атул Рокаде

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.

1

Коли мені потрібно зробити резервну копію файлу, я зазвичай це роблю таким чином.

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

ls -l

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


1
Це нічого не додає, що інші відповіді ще не підведені. Крім того, %Fформат дати створює двозначні місяці і ls -lзазвичай дає трохи більше інформації, ніж просто імена файлів.
Kusalananda

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.