Bir değişkenden dosya adına geçerli bir tarih ekleme


55

Geçerli tarihi şu şekilde bir dosya adının sonuna eklemeye çalışıyorum:

TheFile.log.2012-02-11

İşte şu ana kadar sahip olduğum şey:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

Ancak tüm elde ettiğim dosyanın adı ve hiçbir şey eklemiyor. Geçerli bir tarihi bir dosya adına nasıl eklerim?


randevuyu uyguladığınızda, kullanmamaya dikkat edin :çünkü o zaman rsync ve scp'de bir host olarak okunacaktır. stackoverflow.com/a/37143274/390066
kirill_igum

Yanıtlar:


78

Muhtemelen daha çok sizin kullanımınız set. Bu, 'bugün', '=' ve dateprogramın çıktısını konumsal parametrelere (aka komut satırı argümanları) atayacaktır . Sadece C kabuğunu kullanmak istiyorsunuz (bunu "bash" olarak etiketliyorsunuz, büyük olasılıkla değil), kullanmak isteyeceksiniz:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

Eşittir işaretinin etrafındaki boşlukların bulunmadığına dikkat edin.

Ayrıca &ifadelerinizin sonunda kullanmak istemezsiniz ; Bu, kabuğun komutun bitmesini beklememesine neden olur. Özellikle biri diğerine güvendiğinde. findDaha önce başlatıldığı için komut başarısız olabilir mkdir.


Bu eş için teşekkürler, şu an% 100 para cezası çalışıyor, Gençler için alkışlar ve ve mkdir
I AM L

55

Bir dosya adına bir tarih eklemek için Bash betiği:

Dosyadaki bu bash kodu denir a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

Çalıştığında, yazdırır:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

Kodun açıklaması:

Komut dosyasını / bin / bash yorumlayıcısıyla yorumlayın. Bugün adı verilen yeni bir değişken yapın. Çıkışı yapılandırmak için Y, m, d, H, M, S bayraklarından geçen tarih komutunu yürütün. Sonuç tarih değişkeni içine yerleştirin.

Dosyaadı adı verilen yeni bir değişken oluşturun, $ today değişkenini statik dosyaadı metninin kalanıyla çevreleyin. daha sonra dosya adını ekrana eko edin.

Lulz'u arttırmak için tek bir astarın içine sıkıştırın:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

Birkaç şeyi karıştırmış gibisin.

set today = 'date +%Y'tcsh sözdizimine benziyor, ancak tcsh'de bile dizeyi date +%Ydeğişkene atar today, datekomutu çalıştırmaz . Muhtemelen bash veya başka bir POSIX kabuğu kullandığınızdan, bir ödevin sözdizimi ( today=some_valueeşittir işareti etrafında boşluk olmadan) olur. Komutu çalıştırmak ve çıktısını değişkene atamak için komut değiştirme işlevini kullanın :

today=$(date +%Y-%m-%d)

(Ayrıca tarih belirtimini de tamamladım). Dolar-parantez yerine ters alıntılar kullanabilirsiniz, ancak ileriye dönük alıntılar ile görsel olarak karıştırılmaya eğilimlidir ve ters çevrilmiş komut içinde alıntı yapmanız gerektiğindeki kurallar oldukça karmaşık ve uygulamaya bağımlıdır, bu nedenle buna uymamak daha iyidir $(…)(ki bu daha sağlıklı bir sözdizimi ile aynı etkiye sahiptir).

Birkaç &komutun sonunda kullandın . Bu komutun burada istenmeyen arka planda çalışmasını sağlar. Kastettiğinden şüpheliyim &&, bu yalnızca bir sonraki komut başarılı olursa bir sonraki komutu yürütmek anlamına gelir.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

&&Her komuttan sonra kullanmaya alternatif bir komut dosyası ile başlamaktır set -e. Bu, kabuğa herhangi bir komut sıfır olmayan bir durum döndürdüğünde komut dosyasını çalıştırmayı durdurmasını söyler (koşullar altındaki komutlar ifve birkaç diğer durumlar hariç ).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

Sizin findkomut iyi ama muhtemelen (bunun ne kesin bilmiyorum ama) sen ne yapmak niyetinde yapmaz.

İle bir dizin oluşturuyorsunuz mkdirve sonra hemen onu geziyorsunuz find. Dizin zaten mevcut değilse, bu işe yaramaz. Bugünün günlükleri için bir dizin oluşturmak ve en son dosyaları The_Logsörneğin bir dizine taşımak mı istediniz The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

Yoksa soneki eklemek için bugünün günlük dosyalarını yeniden adlandırmak mı istediniz $today? Bu, taşınacak her bir dosya için farklı dosya adını hesaplamayı gerektirir.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Kullandığım unutmayın -mtimeonların değişiklik zamana dayalı dosyaları taşımak ve değil, -atimebunları yapmazsa, atime kadar geriye olabilir - sistem o izler ise (dosya son okunduğundan zaman olan mtime).


3

Dosyaya eklenen zaman damgasıyla yeniden adlandırabilirsiniz.

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

Bu:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

çalışmalı. Yine de, csh kullanıyormuşsunuz gibi görünüyor ve + işaretini kaldırma çözümüm sizin için işe yaramayabilir ama denemek zarar vermez. Değişkeninizi {} küme parantezlerine almak, beklenmedik değişken açılımlarını önlemek için her zaman iyi bir fikirdir.


Teşekkürler dostum, cevabınızı diğer cevabınızla ekledikten sonra iyi sonuç veriyor.
Ben
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.