Yedekleme dosyasına tarih ekleme


70

Bir dosyanın yedeğini almam gerekiyor ve ayırt etmeyi kolaylaştırmak için adın bir parçası olarak zaman damgasına sahip olmak istiyorum.

Geçerli tarihi bir kopya komutuna nasıl enjekte edersiniz?

[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

Yanıtlar:


109

Bu çalışmıyor çünkü komut dateiçinde boşluk içeren bir dize döndürüyor.

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

Gerçekten böyle bir dosya adı istiyorsanız, o dizeyi tırnak içine almanız gerekir.

$ 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

Muhtemelen eklenecek farklı bir dize düşünmeme rağmen benim tahminim olurdu. Genelde böyle bir şey kullanırım:

$ 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

Tarih ve saat için çıktı etrafında daha fazla biçimlendirme kodu için tarih için man sayfasına bakın .

Ek biçimler

Tam kontrol almak istiyorsanız, man sayfasına başvurursanız, aşağıdakileri yapabilirsiniz:

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

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

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

Not: Aynı çıktıyı kullanabilecek date -Iveya kullanabilirsiniz . Bu anahtar aynı zamanda çeşitli zaman biçimlerini belirtmek için bir argüman alma yeteneğine de sahiptir :date --iso-8601date +"%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.

Örnekler:

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

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

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

1
+1 - Her zaman "% Y% m% d -% H% M% S" veya "% y% m% d -% H% M% S" olarak tarih için bir format belirteci kullanırım.
ChuckCottrill

Sadece touch foo`date +%F`iyi çalışıyor.
Vadzim

csh
ihmal

1
@GovindaSakhare - csh / tcsh alt kabuk gösterimini backticks ( ...) yerine değiştirir $(..). C kabukları görünüşte alt kabuklar için bu gösterimi desteklemiyor.
slm

date +"%Y-%m-%d"aynıdır date -I. Yine de iso formatlarını tavsiye ettim. Kesinlik, parametreye saat, dakika, saniye veya ns eklenerek belirlenebilir -I. Örnek date -Iseconds.
Till Schäfer

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

Bu gibi bir şeye genişler cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. Diş tellerinden önceki boşluk yeni bir kelime başlatır.

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

Diş telleri ayrı kelimelerdir, bu yüzden kelimenin tam anlamıyla yorumlanırlar. Ayrıca, $((…))aritmetik genişlemenin sözdizimidir; çıktısı datearitmetik bir ifadeye benzemez. Komut ikamesi parantez tek bir set kullanır: $(date).

cp foo.txt foo.backup.`date`

Yakından. Bunu diş telleriyle olduğu gibi ifade edebilirdin cp foo.{txt,.backup.`date`}. Hala çıktı dateiçeren boşluklar var, bu yüzden çift tırnak içine alınması gerekiyor. Bu işe yarar:

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

veya

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

Varsayılan çıkış biçimi datebir dosya adına uygun değil ve bir yerel ayar /varsayılan çıktı biçiminde karakterler kullanıyorsa çalışmayabilir . Bir YMD tarih formatı kullanın, böylece dosya adlarındaki sözlük sıralaması kronolojik sıradır (ve ABD ile uluslararası tarih formatları arasındaki belirsizliği önlemek için).

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

sonuncusu bana cp verdi: target `foo..backup.20160913-134158 'bir dizin değil
Kalpesh Soni

@KalpeshSoni Gönderdiğim tam komut bu hata iletisini üretemiyor. Farklı bir komut kullanmış olmalısın.
Gilles

10

Ayrıntılı tarihi kullanmak istiyorsanız, geri tepmeyi korumanız gerekir. Bu tarih formatı, gömülü boşluklara sahip olması, eğer alıntıları içine koymadığınız sürece (veya başka bir şekilde çıkmadığınız sürece) bir Unix kabuğundaki-hayır-hayır şeklindedir.

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

Ancak, daha kısa ISO formatını kullanmayı tercih ediyorum:

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

5

Bir fonksiyon kullanın, hayatınızı kolaylaştıracak. Kullandığım şey bu:

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

Gibi datekendi çıkışında varsayılan beyaz alanlara göre vardır, son komutu başarısız oldu. İçindeki son argümanı alıntı yapmış olsaydın ", çalışması gerekirdi. Diğer denemelerin sadece yanlış sözdizimi var.

İşte boşluk olmadan olası bir çözüm:

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

veya

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

Eklersen

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

sizin .bashrcve yeniden giriş yapın / bash’nın yeniden okumasını sağlayın, sadece aramanız gerekir bk file.txt.


RHEL tarih el kitabım --iso-8601anahtarı göstermiyor, bu yüzden bağlantıyı buraya koydum. GNU tarih seçenekleri: - iso-8601
Ivan Chau

3

Dosyayı, adı eklenen zaman damgasıyla oluşturulan yedekleme dosyasına kopyalayın

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

VEYA:

Dosya içeriğini "cat" kullanarak görüntüleyebilir ve çıktısını, adı eklenen zaman damgasıyla oluşturulan yedek dosyaya yeniden yönlendirebilirsiniz.

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

İhtiyacınıza göre daha fazla FORMAT kontrol seçeneği de kullanabilirsiniz. Örneğin:% H,% M,% S, vb.


catYeniden yönlendirmenin avantajı nedir cp?
Guido

Bunu yapmanın sadece alternatif yolu
Atul Rokade

2

Bir dosyanın yedeğini almak zorunda kaldığımda genellikle bu şekilde yapıyorum.

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

ls -l

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


1
Bu, diğer cevapların daha önce ortaya çıkardığı bir şey eklemez. Ek olarak, %Ftarih formatı 2 basamaklı aylar oluşturur ve ls -lgenellikle dosya adlarından çok daha az bilgi verir.
Kusalananda

1

Bash yazabilirsiniz:

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

Hangi genişler:

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

Sonuçlanan:

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

Sığır eti olmak date -Is. Bunu kullanmayı seviyorum, çünkü hatırlaması kolay, yazın ve kısa sürümlere izin veriyor ( -Inhassas ucube iseniz).


! Bir etkinlik belirleyici başlatır:

 !#     The entire command line typed so far.

Ve $bir kelime göstergesidir:

   $      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

Dosya veya dizinin sadece bir yedeğini almak istiyorsanız, neden hedefi de belirtiyorsanız, kopya dosya adının sonuna tarih eklemek için kabuk genişlemesini kullanın.

yani

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

hangi sonuçlanır

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

veya sadece kullanın

cp filename{,.20190929}

filename.sh.20190929

Gereksinimlerinize göre tarihi ekleyin. :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.