BASH copia tutti i file tranne uno


110

Vorrei copiare tutti i file da una directory eccetto uno denominato Default.png. Sembra che ci siano diversi modi per farlo. Qual è il più efficace per te?


Perché ne hai bisogno per saltare quel file, invece di eliminarlo semplicemente dopo averlo copiato? Esiste già nella directory di destinazione?
Lasse V. Karlsen,

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

@ LasseV.Karlsen: Oppure potresti voler risparmiare il tempo di copiarlo, se si tratta di un file di grandi dimensioni. Mi interessa questo ma escludo una directory piuttosto che un file.
Nikana Reklawyks

Risposte:


54

Semplice, se src/contiene solo file:

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

Se src/ha sottodirectory, le omette, ma copia i file al loro interno:

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

Se src/ha sottodirectory, questo non ricorre in esse:

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

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

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

149

Dovrebbe essere il seguente:

cp -r !(Default.png) /dest

Se si copia in una cartella nidificata nella cartella corrente (chiamata esempio nel caso seguente) è necessario omettere anche quella directory:

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

17
Questo produce -bash:!: Evento non trovato
Joe Cannatti

Stai copiando i file in una cartella nidificata all'interno della cartella da cui stai copiando?
Jon,

47
Ciò richiede shopt -s extglobdi funzionare, se è stato disabilitato.
Barry Kelly,

5
Sembra che OS X debba essere utilizzato shopt -s extglobcome descritto da @BarryKelly. Con quello, funziona perfettamente.
Kat

Anni su Bash e non sapevo di !()... Beautiful! Per coloro che, come me, sentono che è tempo di studiare / rivedere bash , ecco i link pertinenti relativi a questa domanda / risposta: shopt / extglob e il modello .
Brandt

73

rsync è stato il mio sostituto cp / scp per molto tempo:

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

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

Se voglio escludere due file diversi, come lo uso?
Pulkit Bansal

multiple --exclude = gli argomenti sono supportati. E non dimenticare l' -rargomento se stai sincronizzando le directory
Rian Sanderson

5

Farei solo:

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

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

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

1
Il primo comando non è quello che l'OP ha chiesto. Se Default.pngesiste nelle due directory, sostituirà quella in destdircon quella in srcdir, quindi eliminerà quella copiata Default.png. Invece, l'OP vuole mantenere Default.pngciò che già esiste in destdir.
SnowFrog

2
che ne dici di default.png esiste già in destdir? La tua soluzione non funzionerà.
Iman Mohamadi

2

Funziona benissimo per copiare tutto tranne i moduli del nodo :) divertiti e grazie alle risposte sopra ho appena aggiunto ad esso. Rsync è migliore a mio parere di CP in quanto puoi vedere la barra di avanzamento senza chiederlo.

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules


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

-2

usa il parametro di espansione della shell con regex

cp /<path>/[^not_to_copy_file]* .

Tutto verrà copiato tranne il not_to_copy_file

- se qualcosa non va con questo. per favore specificare !


1
Benvenuto in SO. Purtroppo la tua risposta non è corretta. La parentesi expresssion ( [...]) contiene una serie di caratteri da abbinare, mentre un'interlinea ^provocherà una corrispondenza del complemento dei caratteri elencati. Nel seguente esempio, nessuno dei due file verrà elencato: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*perché saranno esclusi tutti i nomi di file che iniziano con uno dei seguenti caratteri: _cefilnopty.
rtx13
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.