Copia un file e aggiungi un timestamp


13

Ho due problemi con il mio script che copia i file e aggiunge un timestamp al nome.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

Quanto sopra viene aggiunto Test2come nome file, ma voglio che mantenga il nome del file del file di origine originale che in questo esempio è denominato Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

L'altro problema è quando aggiungo %rcome codice data / ora viene visualizzato l'errore che indica che la destinazione "PM" non è una directory. Sto cercando di ottenere il timestamp come orario di 12 ore.


Aggiungendo AM / PM aggiungi ulteriore spazio nel nome del file. Se insisti per provare qualcosa di simile: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (data +% m-% d-% y-% r)"
Romeo Ninov

2
Oppuredate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti,

Risposte:


12

Uno dei tuoi problemi è che hai lasciato fuori le doppie virgolette attorno alla sostituzione del comando, quindi l'output del datecomando è stato diviso in spazi. Vedi Perché il mio script shell si soffoca su spazi bianchi o altri caratteri speciali? Questo è un comando valido:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Se vuoi aggiungere al nome del file originale, devi averlo in una variabile.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Se stai usando bash, puoi invece usare l'espansione del controvento.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Se vuoi copiare il file in un'altra directory e aggiungere il timestamp al nome del file originale, puoi farlo in questo modo: si ${source##*/} espande al valore di sourcesenza la parte fino all'ultima /(rimuove il prefisso più lungo corrispondente al modello */):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Se Test1è una directory, viene copiata in modo ricorsivo e i file all'interno della directory mantengono il loro nome: solo la directory di livello superiore riceve un timestamp (ad esempio, Test1/fooviene copiata Test1-05-10-15-07:19:42 PM). Se vuoi aggiungere un timestamp a tutti i nomi dei file, questo è un problema diverso.

La scelta del formato timestamp è una cattiva idea: è difficile da leggere per gli umani e difficile da ordinare. È necessario utilizzare un formato più facile da leggere e che può essere facilmente ordinato, ovvero con parti in ordine decrescente di importanza: anno, mese, giorno, ora, minuto, secondo e con una separazione tra la parte della data e la parte dell'ora.

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"

Gilles, il primo comando non funzionerà IMHO, controlla le posizioni delle doppie virgolette. E vedi il mio commento alla domanda
Romeo Ninov,

@RomeoNinov Cosa c'è che non va nel primo comando? L'hai eseguito e hai ricevuto un errore?
Gilles 'SO- smetti di essere cattivo'

Hai ragione, il comando della data viene eseguito in subshell
Romeo Ninov,

Gilles, usando il tuo esempio sopra, come copierò il file con le informazioni di data e ora sopra menzionate in un'altra directory. Il seguente comando non funziona:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian,

@Brian Non sono sicuro di aver capito il tuo commento, ma vedi la mia modifica.
Gilles 'SO- smetti di essere malvagio'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.