Copie un rango de archivos en la línea de comando (ZSH / BASH)

13

Tengo una lista de archivos con números consecutivos como sufijos. Me gustaría copiar solo un rango de estos archivos. ¿Cómo puedo especificar un rango como parte de mi comando 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*

Me gustaría copiar archivos de P1080275.JPG a P1080283.JPG con algo similar a:

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

¿Hay alguna forma de hacer esto?

Amjith
fuente

Respuestas:

25

Estabas muy cerca. Su pregunta era casi la sintaxis correcta:

cp P10802{75..83}.JPG ~/Images
Glenn Jackman
fuente
9

Para iterar sobre un rango en bash:

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

Aplicando lo mismo en su caso:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done
Shyam Sundar CS
fuente
Esto funciona, pero me gusta más la respuesta de @glenn jackman ya que no invoca ninguna construcción de programación.
Amjith
4

Zsh, con la opción extendedglob, tiene el operador globbing (coincidencia de patrones).

setopt extendedglob
echo P10802<75-83>.JPG

coincidirá con los nombres de archivo en el directorio actual que coincida con ese patrón (tenga en cuenta que P1080275.JPG coincide pero P108020000000075.JPG)

En el otro extremo, el operador de expansión de cadena {x ... y} (compatible con zsh y versiones recientes de bash y ksh93), se expande a las cadenas de x a y, independientemente de los archivos que haya en el directorio actual.

cp P10802<75-83>.JPG ~there

copiará los archivos coincidentes, también lo hará

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

Pero obtendrá errores si, por ejemplo, P1080281.JPG no existe.

sch
fuente
1

Que este trabajo para usted:

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