Pertanto, è possibile utilizzare il *carattere jolly per tutti i file quando si utilizza cpnel contesto di una directory. C'è un modo per copiare tutti i file tranne i xfile?
Pertanto, è possibile utilizzare il *carattere jolly per tutti i file quando si utilizza cpnel contesto di una directory. C'è un modo per copiare tutti i file tranne i xfile?
Risposte:
In bashpuoi usare extglob:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
dove !(b*)escludere tutti i b*file.
In seguito puoi disabilitare extglobcon
$ shopt -u extglob
findsia 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' -aPinterruttore:
a: Simile a cp -a, ricorsivo, ecc. P: mostra i progressi, una bella caratteristica di rsync.
-rPinvece di -aPse si desidera ricorrere. -aè per l'archiviazione. Non sono sicuro se questo è cambiato o se è solo diverso su MacOS.
rsyncha 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, zshsupporta questa sintassi:
$ cp ^x /path/to/destination
Dove ^xsignifica "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, bashe gli strumenti GNU sono fantastici e potenti, ma non sono sempre disponibili. Se hai intenzione di metterlo in uno script portatile, lo consiglierei findcome 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