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.