Copiez une plage de fichiers en ligne de commande (ZSH / BASH)

13

J'ai une liste de fichiers avec des numéros consécutifs comme suffixes. Je souhaite copier uniquement une série de ces fichiers. Comment puis-je spécifier une plage dans le cadre de ma commande cp.

$ls
P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG*
P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG*

Je voudrais copier des fichiers de P1080275.JPG vers P1080283.JPG avec quelque chose de similaire à:

$cp P10802[75-83].JPG ~/Images/.

Y a-t-il un moyen de faire cela?

Amjith
la source

Réponses:

25

Tu étais très proche. Votre question était presque la syntaxe correcte:

cp P10802{75..83}.JPG ~/Images
glenn jackman
la source
9

Pour parcourir une plage en bash:

for x in {0..10}; do echo $x; done

Appliquer la même chose dans votre cas:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done
Shyam Sundar CS
la source
Cela fonctionne, mais j'aime mieux la réponse de @glenn jackman car elle n'invoque aucune construction de programmation.
Amjith
4

Zsh, avec l'option extendedglob a l' opérateur globbing (pattern matching).

setopt extendedglob
echo P10802<75-83>.JPG

correspondra aux noms de fichiers dans le répertoire en cours qui correspondent à ce modèle (attention à ce que P1080275.JPG correspond mais à P108020000000075.JPG également)

À l'autre extrémité, l'opérateur d'expansion de chaîne {x ... y} (pris en charge par zsh et les versions récentes de bash et ksh93), s'étend aux chaînes de x à y, quels que soient les fichiers présents dans le répertoire actuel.

cp P10802<75-83>.JPG ~there

copiera les fichiers correspondants,

cp P10802{75..83}.JPG ~there

Mais vous obtiendrez des erreurs si, par exemple, P1080281.JPG n'existe pas.

sch
la source
1

Est-ce que cela fonctionnerait pour vous:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
Janne Pikkarainen
la source