Cara menambahkan tanggal ke file cadangan


70

Saya perlu membuat cadangan file, dan saya ingin memiliki cap waktu sebagai bagian dari nama untuk membuatnya lebih mudah untuk dibedakan.

Bagaimana Anda akan menyuntikkan tanggal saat ini ke dalam perintah salin?

[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

Jawaban:


109

Ini tidak berfungsi karena perintah datemengembalikan string dengan spasi di dalamnya.

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

Jika Anda benar-benar ingin nama file seperti itu, Anda harus membungkus string itu dengan tanda kutip.

$ 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

Anda mungkin berpikir string yang berbeda untuk ditambahkan akan menjadi tebakan saya. Saya biasanya menggunakan sesuatu seperti ini:

$ 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

Lihat halaman manual untuk tanggal untuk lebih banyak kode pemformatan di sekitar output untuk tanggal & waktu.

Format tambahan

Jika Anda ingin mengambil kendali penuh jika Anda membaca halaman manual Anda dapat melakukan hal-hal seperti ini:

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

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

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

CATATAN: Anda dapat menggunakan date -Iatau date --iso-8601yang akan menghasilkan output yang identik dengan date +"%Y-%m-%d. Switch ini juga memiliki kemampuan untuk mengambil argumen untuk menunjukkan berbagai format waktu :

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

Contoh:

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

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

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

1
+1 - Saya selalu menggunakan penentu format untuk tanggal, baik "% Y% m% d-% H% M% S" atau "% y% m% d-% H% M% S".
ChuckCottrill

Hanya touch foo`date +%F`juga berfungsi dengan baik.
Vadzim

peringatan: Ini tidak bekerja di cshshell
Govinda Sakhare

1
@GovindaSakhare - csh / tcsh mengganti notasi subshell ke backticks ( ...) alih-alih $(..). Kerang C tampaknya tidak mendukung notasi itu untuk subkulit.
slm

date +"%Y-%m-%d"sama dengan date -I. Saya akan merekomendasikan format iso. Ketepatan dapat ditentukan dengan menambahkan jam, menit, detik, atau ns ke parameter -I. Contoh date -Iseconds.
Hingga Schäfer

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

Ini meluas ke sesuatu seperti cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. Ruang sebelum kawat gigi memulai kata baru.

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

Kawat gigi dalam kata-kata yang terpisah, sehingga mereka ditafsirkan secara harfiah. Selanjutnya, $((…))adalah sintaks untuk ekspansi aritmatika; output datetidak seperti ekspresi aritmatika. Substitusi perintah menggunakan satu set tanda kurung: $(date).

cp foo.txt foo.backup.`date`

Lebih dekat. Anda bisa menyatakan ini dengan kawat gigi sebagai cp foo.{txt,.backup.`date`}. Masih ada masalah bahwa output dateberisi spasi, sehingga perlu dimasukkan ke dalam tanda kutip ganda. Ini akan berhasil:

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

atau

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

Format output default datetidak cocok untuk nama file, dan bahkan mungkin tidak berfungsi jika lokal menggunakan /karakter dalam format output default. Gunakan format tanggal YMD sehingga urutan leksikografis pada nama file adalah urutan kronologis (dan juga untuk menghindari ambiguitas antara format tanggal AS dan internasional).

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

yang terakhir memberi saya cp: target `foo..backup.20160913-134158 'bukan direktori
Kalpesh Soni

@KalpeshSoni Perintah persis yang saya posting tidak dapat menghasilkan pesan kesalahan ini. Anda harus menggunakan perintah yang berbeda.
Gilles 'SO- stop being evil'

10

Jika Anda benar-benar ingin menggunakan tanggal verbose, Anda harus melindungi backtick. Format tanggal ini adalah bahwa ia memiliki spasi, no-no dalam shell Unix kecuali Anda menempatkannya di dalam tanda kutip (atau keluar dari mereka dengan cara lain).

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

Namun, saya lebih suka menggunakan format ISO yang lebih pendek:

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

5

Gunakan fungsi, itu akan membuat hidup Anda lebih mudah. Inilah yang saya gunakan:

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

Seperti yang datetelah secara default spasi putih dalam outputnya, perintah terakhir Anda gagal. Jika Anda mengutip argumen terakhir yang ada di dalamnya ", itu seharusnya berhasil. Percobaan Anda yang lain hanya salah sintaks

Di sini solusi yang mungkin tanpa spasi putih:

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

atau

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

Jika Anda menambahkan

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

untuk masuk .bashrcdan kembali / biarkan bash membaca ulang, Anda hanya perlu menelepon bk file.txt.


Manual tanggal RHEL saya tidak menunjukkan --iso-8601saklar, jadi saya meletakkan tautan di sini. Opsi tanggal GNU: --iso-8601
Ivan Chau

3

Anda menyalin file ke file cadangan yang namanya dibuat dengan cap waktu ditambahkan

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

ATAU:

Anda dapat menampilkan konten file menggunakan "cat" dan mengarahkan output ke file cadangan yang namanya dibuat dengan cap waktu yang ditambahkan

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

Anda juga dapat menggunakan lebih banyak opsi kontrol FORMAT sesuai kebutuhan Anda. Misalnya:% H,% M,% S, dll.


Apa keuntungan dari catpengalihan cp?
Guido

Ini hanyalah cara alternatif untuk melakukannya
Atul Rokade

2

Ketika saya harus membuat cadangan file saya biasanya hanya melakukannya dengan cara ini.

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

ls -l

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


1
Ini tidak menambahkan apa pun yang belum diajukan jawaban lain. Selain itu, %Fformat tanggal menghasilkan 2 digit bulan, dan ls -lbiasanya memberikan sedikit info lebih dari sekadar nama file.
Kusalananda

1

Di bash Anda bisa mengetik:

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

Yang diperluas ke:

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

Yang menghasilkan:

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

Makhluk daging sapi date -Is. Saya suka menggunakannya karena mudah diingat, ketik, dan memungkinkan versi pendek (seperti -Injika Anda presisi aneh).


! memulai penunjuk acara:

 !#     The entire command line typed so far.

Dan $adalah penunjuk kata:

   $      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

Jika Anda hanya ingin membuat cadangan file atau direktori lalu mengapa mengetikkan tujuan juga, cukup gunakan ekspansi shell untuk menambahkan tanggal ke akhir nama file salin.

yaitu

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

yang mengakibatkan

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

atau cukup gunakan

cp filename{,.20190929}

filename.sh.20190929

Tambahkan tanggal sesuai kebutuhan Anda. :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.