Copia di file con più estensioni


22

Vorrei copiare i file con più estensioni in una singola directory di destinazione.

Ad esempio, posso usare il seguente comando per copiare tutti i file .txt nella directory di lavoro in una directory chiamata destination:

cp -v *.txt destination/

E posso usare quanto segue per copiare tutte le directory .png nella directory di lavoro in destination:

cp -v *.png destination/

Ma è molto tempo digitare questi come comandi separati (anche con l'uso della cronologia dei comandi). Quindi, c'è un modo che posso dire cpper copiare i file sia con il modello *.txt o il modello *.pnga destination? Idealmente, vorrei essere in grado di specificare più di due modelli - come istruire cpper copiare tutti *.txt o *.png o *.jpg file destination, per esempio.

Sono sicuro che tutto ciò sia possibile usando uno script di shell - sto usando bash, per esempio - ma c'è un modo per realizzarlo più semplicemente, semplicemente dalla console? Potrei in qualche modo usare l'espansione del rinforzo per farlo?

So che è possibile copiare tutti i file nella directory di lavoro tranne quelli che corrispondono a determinati schemi specificati , ma poiché la mia directory di lavoro contiene molte più estensioni di file che non voglio copiare rispetto a quelle che faccio , sarebbe una seccatura.

Hai qualche opinione al riguardo?


10
cp -v *.txt *.png destination/?
Iruvar,

Risposte:


56

L'espansione del rinforzo farà il lavoro. man bashe cerca Brace Expansion.

cp *.{txt,jpg,png} destination/

MODIFICARE:

In linea con la richiesta del PO, al comando sopra mancava l'opzione dettagliata:

cp -v *.{txt,jpg,png} destination/

2
Posso farlo su Windows?
sergiol,

Se lo faccio cp data/images/*.{jpg,jpeg,png,mp4} destination/e un mp4file non esiste, viene visualizzato un No such file or directoryerrore che interrompe lo script. Posso fare in modo che le estensioni multiple gestiscano con grazia qualsiasi formato mancante?
BradGreens,

1
@BradGreens Dovresti davvero pubblicare una nuova domanda piuttosto che porre qui nei commenti. La tua domanda potrebbe anche avere già una risposta. Pubblicare una nuova domanda non solo ti darà una risposta, ma sarà poi consultabile da altri che hanno bisogno dello stesso aiuto.
Timothy Martin,

0
for filename in /Photos/directory/* ; do
    filenameWithoutPath="${filename##*/}"
    first_num="${filenameWithoutPath%%.*}"
    last_num="${filenameWithoutPath##*.}"
    cp $filename /Photos/directory/$first_num-$last_num.jpg
done

Quello sta funzionando!

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.