BASH'de mv ile bir dosya adına zaman damgası ekleme


85

Ben bir linux acemisiyim ve basit bir bash betiğiyle sorun yaşıyorum.

Çalışırken bir günlük dosyasına ekleyen bir programım var. Zamanla bu günlük dosyası çok büyük hale gelir. Her çalıştırmadan önce günlük dosyasını yeniden adlandırıp taşıyacak, programın her çalışması için etkin bir şekilde ayrı günlük dosyaları oluşturacak bir başlangıç ​​betiği oluşturmak istiyorum. Şimdiye kadar sahip olduğum şeyler:

pastebin

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

Koşarken şunu görüyorum:

: command not found
program

Logs dizinine cd ve dizini çalıştırdığımda şunu görüyorum:

201111211437\r.log\r

Neler oluyor? Eksik bir sözdizimi sorunu olduğunu varsayıyorum ama çözemiyorum.


GÜNCELLEME: Shellter'ın aşağıdaki yorumu sayesinde, sorunu .sh dosyasını Windows'ta Notepad ++ ile düzenleyip ftp aracılığıyla sunucuya gönderiyor olmamdan kaynaklandığını buldum, burada dosyayı ssh üzerinden çalıştırıyorum . Dosya üzerinde dos2unix çalıştırıldıktan sonra çalışır.

Yeni soru: Dosyayı her yeniden gönderdiğimde bu düzeltmeyi yapmak zorunda kalmamak için ilk etapta dosyayı nasıl doğru bir şekilde kaydedebilirim?


2
\rcarriage_return, bash betiğinizi inceleyin, belki senaryonun içinde olabilir
ajreal

Bu araba dönüşü nereden geliyor? Bir şeyin logs/$DATE.logyanlış olduğunu tahmin ediyorum , ancak yazmak echo logs/$DATE.logdoğru yolu çıkarır.
Cat5InTheCradle

nasıl bilebilirim? lütfen karşılık gelen bash betiğini ekleyin, muhtemelen fark edilemeyen beyaz alanlar vardır
ajreal

Ana gönderiye bir pastebin bağlantısı eklendi, ancak bu kod parçacığı tam anlamıyla komut dosyasının tamamı, java
.jar'ı

hiçbir fikrim yok ... doğru gözüküyor, peki ya bazı dizeler eklemeyi deneseniz DATE=$(date +"%Y%m%d%H%M")?
ajreal

Yanıtlar:


24

Senaryonuzdan gönderdiğiniz birkaç satır bana güzel görünüyor. Muhtemelen biraz daha derin bir şeydir.

Size bu hatayı hangi satırın verdiğini bulmanız gerekir. Ekle set -xvSenaryonuzun üstüne. Bu, satır numarasını ve STDERR'da çalıştırılan komutu yazdıracaktır . Bu, komut dosyanızın neresinde bu belirli hatayı aldığınızı belirlemenize yardımcı olacaktır.

BTW, senaryonuzun tepesinde bir shebang var mı? Böyle bir şey gördüğümde, normalde bunun Shebang ile ilgili bir sorun olmasını bekliyorum. Örneğin, #! /bin/bashüstteyseniz, ancak bash yorumlayıcınız konumdaysa /usr/bin/bash, bu hatayı görürsünüz.

DÜZENLE

Yeni soru: Dosyayı her yeniden gönderdiğimde bu düzeltmeyi yapmak zorunda kalmamak için ilk etapta dosyayı nasıl doğru bir şekilde kaydedebilirim?

İki yol:

  1. Seç düzenle-> EOL Conversion-> Unix Biçim bir dosyayı düzenlerken menü öğesini. Doğru satır sonlarına sahip olduğunda, Notepad ++ bunları tutacaktır.
  2. Tüm yeni dosyaların doğru satır sonlarına sahip olduğundan emin olmak için, Ayarlar-> Tercihler menü öğesine gidin ve Tercihler iletişim kutusunu açın. Seç Yeni Belge / Standart Dizin sekmesini. Yeni Belge ve Biçim altında , Unix radyo düğmesini seçin. Click Kapat düğmesini.

Deneyebilir miyim bir bakayım. Dosya linux sunucuma ftp olarak gönderildikten sonra dos2unix'i çalıştırmak sorunu çözer, ancak bu fazladan adımın bir yolunu arıyorum. Başlangıçta bir mesele yok, anahtar bu olabilir.
Cat5InTheCradle

2
@AgentSnazz - Ah ha! İşte sorun bu. Unix kabuk betikleri Unix satır sonlarına sahip olmalıdır. Windows / MS-DOS, satırın sonunu işaretlemek için satır başı besleme (aka CRLF veya \ r \ n) kullanır. Unix yalnızca bir satır besleme kullanır (aka LF veya \ n). Bir Windows makinesinde Unix için bir dosya düzenliyorsanız, doğru satır sonlarını yapabilen bir program düzenleyicisi kullanmalısınız ( Vim veya Notepad ++ gibi . Hiçbir zaman Not Defteri kullanmayın . Bu yüzden \rdosya adında onu görüyorsunuz . \rProgramınızdaki her satırın sonunda bir görünmez var .
David W.

83
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log

16
date +"%Y%m%d%H%M"senin
bashın

6
En zinking noktada @ stres için, orada olmalı değil bir işareti artı ve çift tırnak arasındaki boşluğu olmak
PUK

9

Bash içindeki tek satırlı bir yöntem şu şekilde çalışır.

[bazı çıktılar]> $ (tarih "+% Y.% m.% d-% H.% M.% S"). ver

ver uzantılı bir zaman damgası adına sahip bir dosya oluşturur. Aşağıdaki gibi bir tarih damgası dosya adına enstantane çekimi listeleyen bir çalışma dosyası, çalıştığını gösterebilir.

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

Elbette

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

hatta daha basit

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver


5

Bu komutu bir dosyayı basit döndürmek için kullanıyorum:

mv output.log `date +%F`-output.log

Yerel klasörümde 2019-09-25-output.log


4

Aslında, sorunuza doğrudan bir cevap değil, ancak GNU / Linux'ta görevi, günlük dosyalarını düzenli olarak döndürmek, eskileri belirli bir sınıra kadar sıkıştırılmış halde tutmak olan bir araç var. Onunlogrotate


Buna bakacağım, yöntemimi beğendim çünkü programın her çalışmasını kendi günlük dosyasında güzelce sarıyor.
Cat5InTheCradle

1

Komut dosyalarınızı not defterinde yazabilirsiniz, ancak bunları -> $ sed -i 's / \ r $ //' komut satırınızı kullanarak dönüştürdüğünüzden emin olun.

Cygwin'de çalışırken her zaman kullanıyorum ve işe yarıyor. Bu yardımcı olur umarım

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.