El acaparamiento de cada 4 de archivo
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?
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.