Come testare quali file verranno copiati con il comando cp?


11

Sto creando un semplice script che copia tutti i file da DIRECTORYA che non esistono in DIRECTORYB. Lo sto facendo attraverso l'uso del comando cp:

cp -u DIRECTORYA/* DIRECTORYB

Quello che vorrei fare è anche inviare un'e-mail a un amministratore che elencherà i file che sono stati copiati.

Quindi idealmente, prima di eseguire il comando sopra, vorrei ottenere i file che verranno copiati e archiviarli in una variabile per un uso successivo durante la creazione del mio messaggio di posta elettronica.

Qualcuno può indicarmi la giusta direzione? Ho esaminato l'utilizzo di grep ma non penso che ciò possa essere fatto con il comando cp?


1
Forse sto fraintendendo la tua domanda, ma non puoi usare la -vbandiera per stampare i nomi dei file mentre vengono copiati? Reindirizzalo su un file o direttamente in una variabile e usalo per creare il tuo messaggio.
ThibautRenaux

Inoltre, il cpcomando ha un'opzione --attributes-onlyche consente di non copiare i dati dei file, ma solo la struttura di directory e file.
Costas

Mi dispiace, sono abbastanza nuovo negli script. Se uso il flag -v, come posso eseguire l'output in una variabile anziché in un file?
James

1
Supponendo che tu stia usando bash, variable=$(cp -v ...)cattura lo stdout di cp. Vedi gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

Risposte:


4

Non penso che GNU cpabbia qualcosa che ti aiuti se vuoi vedere cosa farebbe senza agire. Se si desidera registrare i file che sono stati modificati, è possibile utilizzare l' -vopzione:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Invece cp, puoi usare rsync , che è molto più potente e installato quasi ovunque tranne che per i sistemi embedded di fascia bassa (e facile da installare dove non è presente per impostazione predefinita).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

o

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

2

Se vuoi correre cp foo*bar whatever, esegui echo foo*bar whateverinvece.


Ma OP vuole correre cp -ue sta cercando un'opzione di tipo dry-run per cp.
Arkadiusz Drabczyk,

2

Secondo la pagina del manuale ,

-u, copia solo quando il file SOURCE è più recente del file di destinazione o quando manca il file di destinazione--update

questa è una funzionalità che combina due test, uno banale da implementare in uno script ( mancante ) e uno che richiede un po 'di lavoro ( più recente ). Si potrebbe fare uno script che riporta ciò che è necessario utilizzare comm, diffe test.

Nessuna delle cputility standard offre la possibilità di eseguire un'operazione di copia a secco. Come suggerito, rsyncè il modo di farlo con un'utilità comunemente disponibile. Naturalmente, di rsyncsolito viene utilizzato per la copia in base a più criteri rispetto a quelli più recenti o mancanti (vengono utilizzati anche dimensioni del file e timestamp). Ma può essere ridotto a fare solo cp -u.

Per le utility non standard, c'è l' copyutilità che ho scritto (e ovviamente ancora uso) alla fine degli anni '80. Probabilmente è stato ispirato makedall'utilità, poiché la prima opzione che ho aggiunto è stata -n.

Per l'esempio fornito, verrebbe utilizzato in questo modo:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Ulteriori letture:

  • copia - utilità per la copia di file / directory

    -n disabilita la creazione o la modifica effettiva dei file e (a seconda del livello di verbosità) mostra l'effetto che copy avrebbe il comando.
    -u copia i file solo se la loro dimensione o data di modifica differisce e collega solo se il testo del collegamento differisce.
    -U copia solo i file più recenti della destinazione o che non esistono nella destinazione.

  • iscrizione al registro delle modifiche dall'agosto 1988 :

    1988/08/16    
            * src / copy / src / copy.c: aggiunte le opzioni "-d" e "-n".
    

0

Puoi usare il comando diff. Ho un lavoro che copia alcuni file di backup ogni giorno. qualche volta ho bisogno di verificare se tutti i file sono copiati, ecco la sintassi:

diff /file1/ /file2/

e ovviamente se vuoi copiarli usa:

cp -u /file1/* /file2

0

Prendi invece in considerazione l'utilizzo di rsync. Rsync funziona perfettamente su copie locali e può certamente fare quello che vuoi, una volta che hai superato le quindici opzioni di gazillion che ha.

rsync -avun DIRECTORYA/ DIRECTORYB

ti mostrerà tutto ciò che sarebbe stato fatto, e

rsync -avu DIRECTORYA/ DIRECTORYB

lo farà.

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.