Pregunta

He de 16.000 jpg de una webcan capturador de pantalla que me deje correr por un año apuntando hacia la parte trasera del año.Quiero encontrar una manera de llamar a cada 4ª imagen, de manera que puedo, a continuación, ponerlos en otro directorio para que yo pueda más tarde se convertirá en una película.Hay un sencillo script en bash o de otra manera bajo linux que puedo hacer esto.

Ellos se nombran como así.......

frame-44558.jpg

frame-44559.jpg

frame-44560.jpg

frame-44561.jpg

Gracias de un newb la necesidad de ayuda.


Parece haber funcionado.Par de errores en mi origonal post.De hecho hubo 280,000 imágenes y la nomenclatura fue./home/baldy/Desktop/webcamimages/webcam_2007-05-29_163405.jpg /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163505.jpg /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163605.jpg

Me encontré.cp $(ls | awk '{nr++;si (nr % 10 == 0) print $0}') ../minuevodirectorio/

Lo que parece haber copiado las imágenes.70-900 por día a partir de las miradas de él.

Ahora estoy corriendo mencoder mf://*.jpg -mf w=640:h=480:fps=30:type=jpg -ovc lavc -lavcopts vcodec=msmpeg4v2 -nosound -s ../salida-msmpeg4v2.avi

Voy a dejar que usted sabe cómo la película funciona.

ACTUALIZACIÓN:La película no funcionó.Sólo tiene imágenes desde 2007 en él a pesar de que el directorio ha de 2008 así.webcam_2008-02-17_101403.jpg webcam_2008-03-27_192205.jpg webcam_2008-02-17_102403.jpg webcam_2008-03-27_193205.jpg webcam_2008-02-17_103403.jpg webcam_2008-03-27_194205.jpg webcam_2008-02-17_104403.jpg webcam_2008-03-27_195205.jpg

¿Cómo puedo modificar mi mencoder línea para que utilice todas las imágenes?

¿Fue útil?

Solución

Una manera sencilla es:

$ touch a b c d e f g h i j k l m n o p q r s t u v w x y z
$ mv $(ls | awk '{nr++; if (nr % 4 == 0) print $0}') destdir

Otros consejos

Crear una secuencia de comandos move.sh que contiene esto:

#!/bin/sh
mv $4 ../newdirectory/

Hacerlo ejecutable y, a continuación, hacer esto en la carpeta:

ls *.jpg | xargs -n 4 ./move.sh

Esto lleva a la lista de nombres de archivo, que pasa de cuatro en cuatro en move.sh que, a continuación, ignora los tres primeros y se mueve el cuarto en una carpeta nueva.

Esto funciona incluso si los números no están exactamente en la secuencia (por ejemplo,si algunos de los números de fotograma que faltan, a continuación, utilizando mod 4 aritmética no funcionará).

Como se ha sugerido, usted debe utilizar

seq -f 'frame-%g.jpg' 1 4 number-of-frames

para generar la lista de nombres de archivos desde el 'ls' se producirá en 280k archivos.Así que la solución final sería algo como:

for f in `seq -f 'frame-%g.jpg' 1 4 number-of-frames` ; do
  mv $f destdir/
done
seq -f 'frame-%g.jpg' 1 4 number-of-frames

...se imprima los nombres de los archivos que usted necesita.

Una manera fácil en perl (probablemente fácilmente adaptable a bash) es glob los nombres de archivo en una matriz, a continuación, obtener el número de secuencia y eliminar aquellos que no son divisibles por 4

Algo como esto va a imprimir los archivos que usted necesita:

ls -1 /path/to/files/ | perl -e 'while (<STDIN>) {($seq)=/(\d*)\.jpg$/; print $_ if $seq && $seq % 4 ==0}'

Usted puede reemplazar la impresión de un movimiento...

Esto funcionará si los archivos están numerados en secuencia, incluso si el número de dígitos no es constante como file_9.jpg seguido por file_10.jpg )

Dado masto las advertencias acerca de la clasificación:

ls | sed -n '1~4 p' | xargs -i mv {} ../destdir/

La cosa que me gusta de esta solución es que todo lo que está haciendo lo que fue diseñado, por lo que se siente unixy a mí.

Sólo iterar a través de una lista de archivos:

files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
  cur_file=${files[$i]}
  mungle_frame $cur_file
  i=$( expr $i + 4 )
done

Esto es bastante cursi, pero se debe hacer el trabajo.Suponiendo que actualmente cd que había en el directorio que contiene todos los archivos:

mkdir ../outdir
ls | sort -n | while read fname; do mv "$fname" ../outdir/; read; read; read; done

El sort -n hay asumiendo que sus nombres no todos tienen el mismo número de dígitos;de lo contrario, ls va a ordenar en orden léxico donde frame-123.jpg viene antes de frame-4.jpg y no creo que lo que usted desea.

Por favor, tenga cuidado, copia de seguridad de sus archivos antes de intentar mi solución, etc.Yo no quiero ser responsable de que perder un año la pena de datos.

Tenga en cuenta que esta solución no manejar archivos con espacios en el nombre, a diferencia de la mayoría de los demás.Sé que no era parte de la muestra los nombres de archivo, pero es fácil escribir comandos de la shell que no manejan espacios de forma segura, así que yo quería hacer en este ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top