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?

Réponses:


25

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

cp P10802{75..83}.JPG ~/Images

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

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.


1

Est-ce que cela fonctionnerait pour vous:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.