Copia ogni file in una struttura di directory nel percorso specifico solo se il file non esiste già lì


8

Vorrebbe copiare ogni file da una struttura di directory in una directory specifica solo se il file non esiste già lì.

Ho ottenuto la prima parte da questa domanda Stack Overflow :

find . -type f -exec cp {} /target-directory \;

Come posso verificare se il file esiste o no? In caso contrario, copia il file, altrimenti salta.


Intendi "copiare tutti i file nella struttura dei sorgenti in una (specifica) directory singola senza sottodirectory"? Oppure "copiare tutti i file nella struttura di origine in una sottodirectory della directory di destinazione simile a dove si trovava nella struttura di origine"? Ho letto la domanda come primo caso: puoi modificare la domanda per chiarire? (So ​​che hai la tua risposta, ma sarà letta e utilizzata da altri.)
Volker Siegel,

Risposte:


13

Puoi usare -uswitch dal cpcomando:

copia solo quando il file SOURCE è più recente del file di destinazione o quando manca il file di destinazione

o usa il rsynccomando con --ignore-existing:

salta l'aggiornamento dei file esistenti sul ricevitore

Esempio:

rsync --ignore-existing source/* destination/

3

Il comando originale può essere riscritto come:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

La chiave qui è che chiamiamo shell con comandi specifici e passiamo il file trovato come $1argomento. Se test -e /target-directory/"$1"fallisce, significa che il file non esiste, nel qual caso cpil file verrà copiato.

In generale, si possono usare altri comandi, purché il comando possa verificare l'esistenza di un file. Alcune delle altre alternative:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

2
Perché stattestare l'esistenza dei file in Bash? Non test -esarebbe molto più semplice?
David Foerster,

@DavidFoerster Nessun motivo particolare. farà anche il comando test.
Modificherò la

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.