2009-11-25 5 views
16

Desidero aggiungere la data accanto a un nome file ("somefile.txt"). Ad esempio: somefile_25-11-2009.txt o somefile_25Nov2009.txt o qualsiasi cosa a tale effettoAggiungi data al nome file in linux

Forse uno script eseguirà o un comando nella finestra del terminale. Sto usando Linux (Ubuntu).

Grazie in anticipo.

oh ho quasi dimenticato di aggiungere che lo script o il comando dovrebbe aggiornare il nome file in una nuova data ogni volta che si desidera salvare il file in una cartella specifica mantenendo i file precedenti. Così alla fine ci sarebbero file come questo: filename_18Oct2009.txt, filename_9Nov2009.txt, filename_23Nov2009.txt

+4

Si consiglia AAAA-MM-DD, invece di gg-mm-aaaa per ottenere sorta lessicografico di nomi di file a anche ordinali in ordine cronologico. – laalto

risposta

20

È possibile utilizzare i backtick.

$ echo "myfilename-"`date +"%d-%m-%Y"` 

Resa:

myfilename-25-11-2009 
+0

Aggiunge la data al nome file - nell'esempio nella domanda la data deve andare * tra * il nome del file e l'estensione. –

+5

Questo ha funzionato per me: 'test echo>" data-csv - "\' date + "% Y-% m-% d" \ "" .txt "' –

+1

Oppure: 'test echo>" data-csv- " \ 'date +"% Y-% m-% d.txt "\' ' –

10
cp somefile somefile_`date +%d%b%Y` 
31

Ci sono due problemi qui.

1. ottenere la data come una stringa

Questo è abbastanza facile. Basta usare il comando date con l'opzione +. Possiamo usare i backtick per acquisire il valore in una variabile.

$ DATE=`date +%d-%m-%y` 

È possibile modificare il formato della data utilizzando diversi % opzioni, come indicato alla date man page.

2. Dividere un file in nome ed estensione.

Questo è un po 'più complicato. Se pensiamo che saranno solo uno . nel nome del file, possiamo usare cut con il . come delimitatore.

$ NAME=`echo $FILE | cut -d. -f1 
$ EXT=`echo $FILE | cut -d. -f2` 

Tuttavia, questo non funzionerà con più . nel nome del file. Se stiamo usando bash - che probabilmente si è - siamo in grado di utilizzare alcuni bash magic that allows us to match patterns when we do variable expansion:

$ NAME=${FILE%.*} 
$ EXT=${FILE#*.} 

Metterli insieme otteniamo:

$ FILE=somefile.txt    
$ NAME=${FILE%.*} 
$ EXT=${FILE#*.} 
$ DATE=`date +%d-%m-%y`   
$ NEWFILE=${NAME}_${DATE}.${EXT} 
$ echo $NEWFILE     
somefile_25-11-09.txt       

E se siamo meno preoccupati per la leggibilità facciamo tutto il lavoro su una linea (con un formato di data diversa):

$ FILE=somefile.txt 
$ FILE=${FILE%.*}_`date +%d%b%y`.${FILE#*.} 
$ echo $FILE         
somefile_25Nov09.txt 
+0

Grazie a Dave ma come o dove eseguo questo script? Perdonami, sono nuovo con Linux. – sami

+0

Puoi dare qualche dettaglio in più su quello che vuoi fare. Quindi hai un file in una directory che vuoi stampare in questo modo. È solo un file con lo stesso nome ogni volta o potrebbe essere un numero di file con un numero di nome diverso? –

+1

ho modificato la mia domanda in cima, per favore dai un'occhiata. – sami

0

soluzione un po 'più complicata che corrisponde appieno la vostra spec

echo `expr $FILENAME : '\(.*\)\.[^.]*'`_`date +%d-%m-%y`.`expr $FILENAME : '.*\.\([^.]*\)'` 

dove prima 'expr' estrae il nome del file senza estensione, secondo 'expr' estratti estensione