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 extglobdi funzionare, se è stato disabilitato.
shopt -s extglobcome 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
-rargomento 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.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.
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.