2009-08-21 18 views
55

Vorrei copiare tutti i file da una directory ad eccezione di uno denominato Default.png. Sembra che ci siano diversi modi per farlo. Cosa ti sembra più efficace?BASH copia tutti i file tranne uno

+0

Perché avete bisogno di saltare quel file, piuttosto che semplicemente cancellarlo dopo averlo copiato? Esiste già nella directory di destinazione? –

+0

Sì, un file con lo stesso nome è già presente nella directory di destinazione. –

+0

@ LasseV.Karlsen: Oppure potresti risparmiare il tempo di copiarlo, se si tratta di un file di grandi dimensioni. Sono interessato a questo, ma escludendo una directory piuttosto che un file. –

risposta

34

semplice, se src/ contiene solo file:

find src/ ! -name Default.png -exec cp -t dest/ {} + 

Se src/ ha sotto-directory, questo li omette, ma non copiare i file all'interno di esse:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} + 

Se src/ ha sottodirectory, questo non le riceva:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} + 
+2

Questo risulta essere il migliore per me perché sembrerebbe che OS X venga fornito senza glob abilitato. –

+1

Qualcuno potrebbe spiegare per cosa è il "segno più" alla fine del comando? Ho sempre visto \; alla fine di un'opzione -exec, è lo stesso? – Max

+6

@Max '\;' esegue il comando una volta per file. '+' esegue il comando una volta e passa tutti i nomi dei file contemporaneamente (soggetto al limite di lunghezza della riga di comando). '+' è un po 'più efficiente in generale. –

99

dovrebbe essere la seguente:

cp -r !(Default.png) /dest 

Se la copia in una cartella annidata nella cartella corrente (chiamato esempio nel caso in basso) è necessario omettere quella directory anche:

cp -r !(Default.png|example) /example 
+9

Questo produce -bash:!: Evento non trovato –

+0

Stai copiando i file in una cartella annidata all'interno della cartella da cui viene copiata? – Jon

+29

Ciò richiede che 'shopt -s extglob' funzioni, se è stato disabilitato. –

3

I Basta fare:

cp srcdir/* destdir/ ; rm destdir/Default.png 

a meno che i file non siano grandi. Altrimenti usa per es.

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/ 
+0

grep -v è tuo amico –

+1

Il primo comando non è quello che l'OP chiedeva. Se 'Default.png' esiste nelle due directory, sostituirà quello in' destdir' con quello in 'srcdir', quindi cancellerà il' Default.png' copiato. Invece, l'OP vuole mantenere il 'Default.png' che già esiste in' destdir'. – SnowFrog

43

rsync è stata la mia cp sostituzione/SCP per lungo tempo:

rsync -av from/ to/ --exclude=Default.png 

-a, --archive    archive mode; equals -rlptgoD (no -H,-A,-X) 
-v, --verbose    increase verbosity 
+2

La tua risposta non mi è chiara come tutti i comandi rsync. Ecco perché non la uso. Che cos'è 'rlptgoD' e che cos'è' HAX'? Perché crei un archivio? – Simon

1
cp `ls | grep -v Default.png` destdir 
+5

Questo è più probabile che produca errori piuttosto che fare ciò che intendi. –

+0

Questo mi sta meglio – once

-1
# chattr +i /files_to_exclude 
# cp source destination 
# chattr -i /files_to_exclude 
Problemi correlati