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?
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?
Risposte:
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/ {} +
\;
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.
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
shopt -s extglob
di funzionare, se è stato disabilitato.
shopt -s extglob
come descritto da @BarryKelly. Con quello, funziona perfettamente.
!()
... 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 .
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
-r
argomento se stai sincronizzando le directory
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/
Default.png
esiste nelle due directory, sostituirà quella in destdir
con quella in srcdir
, quindi eliminerà quella copiata Default.png
. Invece, l'OP vuole mantenere Default.png
ciò che già esiste in destdir
.
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
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
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 !
[...]
) 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
.