Tengo muchos archivos en una carpeta, nombrados como 00802_Bla_Aquarium_XXXXX.jpg
. Ahora necesito copiar cada 4to archivo a una subcarpeta, diciendo en selected/
.
00802_Bla_Aquarium_00020.jpg <= this one
00802_Bla_Aquarium_00021.jpg
00802_Bla_Aquarium_00022.jpg
00802_Bla_Aquarium_00023.jpg
00802_Bla_Aquarium_00024.jpg <= this one
00802_Bla_Aquarium_00025.jpg
00802_Bla_Aquarium_00026.jpg
00802_Bla_Aquarium_00027.jpg
00802_Bla_Aquarium_00028.jpg <= this one
00802_Bla_Aquarium_00029.jpg
¿Cómo hago esto?
ls
. Consulte también stackoverflow.com/q/4553751/789593 que pregunta sobre cada segunda línea.for n in $(seq -w 20 4 200); do cp "00802_..._00${n}" ...; done
Respuestas:
Con zsh, podrías hacer:
POSIXY, la misma idea, solo un poco más detallado:
Dado que esos nombres de archivo no contienen caracteres en blanco o comodín, también puede hacer:
fuente
for i do
es estándar y en realidad es más portátil quefor i; do
y es la forma canónica de recorrer los parámetros posicionales.En bash, una posibilidad divertida, que funcionará bastante bien aquí:
Esa es definitivamente la respuesta más corta y eficiente: sin subshell, sin bucle, sin tubería, sin
awk
proceso externo de barrio; solo una bifurcación paracp
(que no puede evitar de todos modos) y una expansión de llave bash y glob (que puede eliminar por completo ya que sabe cuántos archivos tiene).fuente
cp 00802_Bla_Aquarium_*{03..99..4}.jpg selected
si lo desea3 mod 4
. (Estoy usando el hecho maravilloso de que 100 es divisible por 4). Ahora, sobre archivos numerados continuamente, todas las otras respuestas asumen lo mismo.Simplemente con bash, puedes hacer:
El patrón
./*.jpg
será reemplazado por una lista ordenada alfabéticamente de nombres de archivos según lo indicado por el hombre de bash, por lo que debe ajustarse a su propósito.fuente
for
bucle se puede reemplazar con sólo esta línea:(((++n)%4)) || cp "$file" selected/
.;-)
. Sin embargo, el problema es que está bifurcando un archivocp
para cada archivo que no es realmente eficiente.Si lo ha
ruby
instalado, puede usar el siguiente one-liner. Tenga en cuenta que supone que el directorio seleccionado existe.Toma una lista de todos los archivos con la extensión .jpg en el directorio actual y la divide en listas de cuatro elementos y copia el primer elemento de cada lista en el directorio seleccionado en el directorio actual.
fuente
Si sabe que no tendrá nuevas líneas en sus nombres de archivo, puede usar:
fuente
Puede usar un administrador de archivos GUI y cambiar el tamaño del borde de la ventana hasta que cada 5 archivos ocupen una fila, y luego usar el mouse para seleccionar la primera columna ...
fuente
Mirando stackoverflow.com/q/4553751/789593 que ofrece una solución para copiar cada segundo como se menciona en @NN, una solución muy simple sería:
Puede que no sea muy eficiente ya que requiere un bit de paso de copia adicional, debería ser muy fácil de hacer.
fuente