Pertanto, è possibile utilizzare il *
carattere jolly per tutti i file quando si utilizza cp
nel contesto di una directory. C'è un modo per copiare tutti i file tranne i x
file?
Pertanto, è possibile utilizzare il *
carattere jolly per tutti i file quando si utilizza cp
nel contesto di una directory. C'è un modo per copiare tutti i file tranne i x
file?
Risposte:
In bash
puoi usare extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
dove !(b*)
escludere tutti i b*
file.
In seguito puoi disabilitare extglob
con
$ shopt -u extglob
find
sia l'unico modo per tcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync lo gestisce bene.
Esempio copia tutto: rsync -aP /folder1/* /folder/2
Esempio copia tutto con esclusione: rsync -aP --exclude=x /folder1/* /folder2/
L' -aP
interruttore:
a: Simile a cp -a
, ricorsivo, ecc. P: mostra i progressi, una bella caratteristica di rsync.
-rP
invece di -aP
se si desidera ricorrere. -a
è per l'archiviazione. Non sono sicuro se questo è cambiato o se è solo diverso su MacOS.
rsync
ha la possibilità di renderlo ricorsivo. Esempio: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Testato solo su Ubuntu)
Questa non è una caratteristica di cp
, è una caratteristica della tua shell (si espande *
per significare tutti i file non punti), quindi la risposta dipende da quale shell stai usando. Ad esempio, zsh
supporta questa sintassi:
$ cp ^x /path/to/destination
Dove ^x
significa "tutti i file tranne x
"
È inoltre possibile combinare modelli di selezione e deselezione, ad esempio per copiare tutti i file wav tranne quelli contenenti xyz, è possibile utilizzare:
cp *.wav~*xyz*
bash
?
Potrebbe anche essere fatto in una semplice shell bourne vecchia (portatile / compatibile) in una varietà di modi con strumenti standard in modi molto meno eleganti rispetto all'utilizzo di globbing o comandi avanzati della shell con opzioni di esclusione integrate.
Se non ci sono troppi file (e non con nomi che includono spazi e / o interruzioni di riga), questo potrebbe essere un modo:
cp `ls | egrep -v '^excludename$'` destdir/.
Certo, bash
e gli strumenti GNU sono fantastici e potenti, ma non sono sempre disponibili. Se hai intenzione di metterlo in uno script portatile, lo consiglierei find
come nel commento di Rush.
Se vuoi copiare tutto in una cartella (comprese le sottocartelle) in una particolare sottodirectory:
cp -R $(ls | grep -v '^subdir$') subdir/
Funziona con sh, bash, zsh (almeno).
cp -R * subdir/
cp
(non da bash
/ sh
), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
". La copia si completa correttamente, però. Sfortunatamente la tua variante si interrompe con qualsiasi nome di file contenente uno spazio o una punteggiatura sensibile alla shell. Vedi unix.stackexchange.com/q/128985/135943
extglob
è il modo migliore finora immagino.
Un altro modo è usare
cp $(ls --ignore=x) subdir/
$
ecc.) Non analizzare mai l'output di ls
. unix.stackexchange.com/q/128985/135943