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?

Respuestas:


25

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

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

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

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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.