Copie de fichiers avec plusieurs extensions

22

Je voudrais copier des fichiers avec plusieurs extensions dans un seul répertoire de destination.

Par exemple, je peux utiliser la commande suivante pour copier tous les fichiers .txt du répertoire de travail dans un répertoire appelé destination:

cp -v *.txt destination/

Et je peux utiliser ce qui suit pour copier tous les répertoires .png du répertoire de travail vers destination:

cp -v *.png destination/

Mais il faut beaucoup de temps pour les taper en tant que commandes distinctes (même avec l'utilisation de l'historique des commandes). Alors, est-il possible de dire cpde copier des fichiers avec le motif *.txt ou le motif *.pngvers destination? Idéalement, je voudrais être en mesure de préciser plus de deux modèles - comme l' instruction cpde copier tout *.txt ou *.png ou *.jpg des fichiers destination, par exemple.

Je suis sûr que tout cela est possible en utilisant un script shell - j'utilise bash, par exemple - mais y a-t-il un moyen de le faire plus simplement, juste à partir de la console? Puis-je utiliser l'expansion d'accolade pour le faire?

Je sais qu'il est possible de copier tous les fichiers du répertoire de travail à l'exception de ceux correspondant à certains modèles spécifiés , mais comme mon répertoire de travail contient beaucoup plus d'extensions de fichiers que je ne veux pas copier que celles que je fais , ce serait pénible.

Avez-vous des réflexions à ce sujet?

Andrew
la source
10
cp -v *.txt *.png destination/?
iruvar

Réponses:

56

L'expansion de l'accolade fera le travail. man bashet recherchez Brace Expansion.

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

MODIFIER:

Conformément à la demande du PO, la commande ci-dessus manquait l'option détaillée:

cp -v *.{txt,jpg,png} destination/
Timothy Martin
la source
2
Puis-je le faire sous Windows?
sergiol
Si je le fais cp data/images/*.{jpg,jpeg,png,mp4} destination/et qu'un mp4fichier n'existe pas, j'obtiens une No such file or directoryerreur qui rompt le script. Puis-je faire en sorte que les multiples extensions gèrent correctement les formats manquants?
BradGreens
1
@BradGreens Vous devriez vraiment poster une nouvelle question plutôt que de la poser ici dans les commentaires. Votre question peut même déjà avoir une réponse. Publier une nouvelle question vous permettra non seulement d'obtenir une réponse, mais elle sera ensuite consultable par d'autres personnes qui ont besoin de la même aide.
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

Ça marche!

Ofek Ortal
la source