Come copiare alcuni, ma non tutti i file?


54

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:


42

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

Sai se c'è qualcosa di equivalente per la shell tcsh?
Levon,

Sfortunatamente no. Sembra che findsia l'unico modo per tcsh:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
correre il

50

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.


5
E vedi questa risposta per una breve guida agli elenchi di esclusione rsync comuni.
Gilles 'SO- smetti di essere malvagio' il

1
Su darwin / MacOS, utilizzare -rPinvece di -aPse si desidera ricorrere. -aè per l'archiviazione. Non sono sicuro se questo è cambiato o se è solo diverso su MacOS.
jpoveda,

rsyncha la possibilità di renderlo ricorsivo. Esempio: rsync --recursive -P --exclude=x /folder1/* /folder2/. (Testato solo su Ubuntu)
n1k31t4

12

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*

Qualche commento su bash?
Chad Harrison,

@hydroparadise Non so molto di bash, ma questa risposta sembra coprirla
Michael Mrozek

Che dire di tcsh? Qualcuno sa?
Levon,

4

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.


2
Trovo che l'ultima parte della tua risposta distrae solo l'argomento in questione. Inoltre, "Unix" non è più il gold standard (se mai lo fosse). Non è poi così rilevante se qualcosa è "Unix" o non più, nonostante il titolo di questo sito sia "Unix e Linux".
Alexander,

2
OK. Ho spostato il commento qui, invece: Unix non è GNU. Concordo sul fatto che l '"unicità" delle cose non è molto interessante, ma credo ancora nella portabilità e nella conoscenza della tua storia.
MattBianco,

Sono pienamente d'accordo con te lì.
Alexander,

2

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).


1
Convincimi che questa non è la stessa intenzione dicp -R * subdir/
roaima,

1
Se si utilizza quel comando "cp -R * subdir /", bash / zsh ha provato a copiare 'subdir' in modo ricorsivo. Si finisce con un errore: "nome troppo lungo (non copiato)".
user2707671,

Buon punto. Il tuo suggerimento tenta di evitare l'avviso da 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
roaima il

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.