2011-11-22 13 views
51

Bene, sono un novellino di Linux e sto riscontrando un problema con un semplice script di bash.Aggiunta data e ora a un nome file con mv in BASH

Ho un programma che si aggiunge a un file di registro mentre è in esecuzione. Nel corso del tempo il file di registro diventa enorme. Mi piacerebbe creare uno script di avvio che rinomina e sposta il file di registro prima di ogni esecuzione, creando in effetti file di registro separati per ogni esecuzione del programma. Ecco quello che ho finora:

pastebin

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

Quando viene eseguito, vedo questo:

: command not found 
program 

Quando I cd alla directory registri e corrono dir, vedo questo:

201111211437\r.log\r 

Cosa sta succedendo? Presumo che manchi qualche problema di sintassi, ma non riesco a capirlo.


UPDATE: Grazie a Shellter di commento qui sotto, ho trovato il problema sia dovuto al fatto che sto modificando il file .sh in Notepad ++ in Windows, e quindi l'invio via ftp al server, dove eseguo il file tramite ssh. Dopo aver eseguito dos2unix sul file, funziona.

Nuova domanda: come posso salvare il file correttamente, in primo luogo, per evitare di dover eseguire questa correzione ogni volta che rinvio il file?

+2

'\ R' è carriage_return, esaminare lo script bash, forse è incluso all'interno dello script – ajreal

+0

Da dove arriverà quella retata? Sto indovinando che qualcosa su 'logs/$ DATE.log' è sbagliato, ma digitando' echo logs/$ DATE.log' restituisce il percorso corretto. – Cat5InTheCradle

+0

come lo saprei? si prega di allegare lo script di bash corrispondente, probabilmente ci sono spazi vuoti invisibili – ajreal

risposta

19

Le poche righe in cui hai postato dal vostro script guardano bene a me. Probabilmente è qualcosa di un po 'più profondo.

È necessario trovare quale riga ti sta dando questo errore. Aggiungi set -xv all'inizio del tuo script. Questo stamperà il numero di riga e il comando che viene eseguito su STDERR. Questo ti aiuterà a identificare dove nel tuo script stai riscontrando questo particolare errore.

BTW, hai uno shebang nella parte superiore del tuo script? Quando vedo qualcosa del genere, normalmente mi aspetto un problema con lo Shebang. Ad esempio, se avevi #! /bin/bash in cima, ma il tuo interprete bash si trova in /usr/bin/bash, vedrai questo errore.

EDIT

nuova domanda: Come è possibile salvare il file in modo corretto, in primo luogo, per evitare di dover eseguire questa correzione ogni volta che risentirei il file?

due modi:

  1. selezionare il Modifica-> EOL Conversion-> Unix Formato voce di menu quando si modifica un file. Una volta che ha le terminazioni di linea corrette, Notepad ++ le manterrà.
  2. per assicurarsi che tutti i nuovi file hanno le terminazioni di linea corretti, andare ai Impostazioni-> Preferenze voce di menu, e tirare la finestra di dialogo Preferenze. Selezionare la scheda Nuovo documento/Directory predefinita. Sotto Nuovo documento e Formato, selezionare il pulsante di opzione Unix. Fai clic sul pulsante Chiudi.
+0

Vedrò se posso provarlo. dos2unix esecuzione una volta che il file viene presi con ftp al mio server Linux risolve il problema, ma sto cercando un modo per aggirare quel passo in più. All'inizio non ho uno shebang, quella potrebbe essere la chiave. – Cat5InTheCradle

+1

@AgentSnazz - Ah ah! Questo è il problema. Gli script di shell Unix devono avere terminazioni di linea Unix. Finestre/MS-DOS utilizza ritorno a capo-avanzamento riga (alias CRLF o \ r \ n) per segnare la fine della linea. Unix usa solo un linefeed (aka LF o \ n). Se si sta modificando un file per Unix su una macchina Windows, è necessario utilizzare un editor di programma che può fare la fine riga corretti (come [Vim] (http://www.vim.org) o [Notepad ++] (http://notepad-plus-plus.org/). ** non utilizzare mai il Blocco note **. è per questo che si sta vedendo la '\ R' nel nome del file. C'è un invisibile' \ R' alla fine di ogni riga nel programma –

+0

@AgentSnazz -. Guardate la mia risposta di modifica. –

4

Bene, non è una risposta diretta alla tua domanda, ma c'è uno strumento in GNU/Linux il cui compito è di ruotare i file di registro su base regolare, mantenendo i vecchi zippati fino a un certo limite. E 'logrotate

+0

Lo vedrò, mi piace il mio metodo perché avvolge in modo graduale ogni esecuzione del programma nel proprio file di registro. – Cat5InTheCradle

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

'date + "% Y% m% d% H% M"' se la bash è un po 'diversa – zinking

+2

Per sottolineare @ punto di zincatura, ci deve ** non ** essere uno spazio tra il segno più e le doppie virgolette – puk

0

È possibile scrivere i propri script in blocchetto per appunti, ma solo assicurarsi di convertire li utilizzando questo -> $ sed -i 's/\ r $ //' yourscripthere

Io lo uso per tutto il tempo che quando lavoro in cygwin e funziona. Spero che questo aiuti

2

Un metodo a linea singola all'interno di bash funziona in questo modo.

[un po 'fuori messo]> $ (data "+% Y% m.% D-% H.% M% S"). Ver

creerà un file con un nome timestamp con ver estensione. Un file di lavoro che elenca lo snapshot su un nome di file timbro data come segue può mostrarlo funzionante.

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

Naturalmente

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

o ancora più semplice

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