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}" ...; doneRespuestas:
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 does estándar y en realidad es más portátil quefor i; doy 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
awkproceso 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 selectedsi 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
./*.jpgserá 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
forbucle se puede reemplazar con sólo esta línea:(((++n)%4)) || cp "$file" selected/.;-). Sin embargo, el problema es que está bifurcando un archivocppara cada archivo que no es realmente eficiente.Si lo ha
rubyinstalado, 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