Pergunta

Eu tenho 16.000 jpgs de um webcan screeb grabber que deixei rodar por um ano, apontando para o ano anterior.Quero encontrar uma maneira de capturar cada quarta imagem para poder colocá-las em outro diretório para depois transformá-las em um filme.Existe um script bash simples ou outra forma no Linux que eu possa fazer isso.

Eles são nomeados assim......

quadro-44558.jpg

quadro-44559.jpg

quadro-44560.jpg

quadro-44561.jpg

Obrigado de um novato que precisa de ajuda.


Parece ter funcionado.Alguns erros em minha postagem original.Na verdade, havia 280.000 imagens e o nome era.O 163605.JPG

Eu corri.cp $(ls | awk '{nr++;if (nr % 10 == 0) imprimir $0}') ../newdirectory/

Que parece ter copiado as imagens.70-900 por dia, pelo que parece.

Agora estou correndo mencoder mf://*.jpg -mf w=640:h=480:fps=30:type=jpg -ovc lavc -lavcopts vcodec=msmpeg4v2 -nosound -o .. /saída-msmpeg4v2.avi

Vou deixar você saber como o filme funciona.

ATUALIZAR:O filme não funcionou.Contém apenas imagens de 2007, embora o diretório também contenha 2008.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

Como posso modificar minha linha mencoder para que ela use todas as imagens?

Foi útil?

Solução

Uma maneira simples é:

$ 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

Outras dicas

Crie um script move.sh que contenha isto:

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

Torne-o executável e faça isso na pasta:

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

Isso pega a lista de nomes de arquivos, passa quatro de cada vez para move.sh, que então ignora os três primeiros e move o quarto para uma nova pasta.

Isto funcionará mesmo que os números não estejam exatamente em sequência (por exemplose alguns números de quadros estiverem faltando, usar a aritmética do mod 4 não funcionará).

Como sugerido, você deve usar

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

para gerar a lista de nomes de arquivos, pois 'ls' falhará em arquivos de 280k.Então a solução final seria 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

…irá imprimir os nomes dos arquivos que você precisa.

Uma maneira fácil em perl (provavelmente facilmente adaptável ao bash) é agrupar os nomes dos arquivos em uma matriz, obter o número de sequência e remover aqueles que não são divisíveis por 4

Algo assim imprimirá os arquivos que você precisa:

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

Você pode substituir a impressão por um movimento...

Isso funcionará se os arquivos forem numerados em sequência, mesmo que o número de dígitos não seja constante como file_9.jpg seguido pela file_10.jpg )

Dadas as advertências do masto sobre a classificação:

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

O que eu gosto nessa solução é que tudo está fazendo o que foi projetado para fazer, então parece estranho para mim.

Basta iterar em uma lista de arquivos:

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

Isso é muito extravagante, mas deve dar conta do recado.Supondo que você esteja atualmente cd no diretório que contém todos os seus arquivos:

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

O sort -n está assumindo que seus nomes de arquivos não têm o mesmo número de dígitos;de outra forma ls classificará em ordem lexical onde frame-123.jpg vem antes frame-4.jpg e não acho que seja isso que você quer.

Tenha cuidado, faça backup de seus arquivos antes de tentar minha solução, etc.Não quero ser responsável pela perda de dados de um ano.

Observe que esta solução lida com arquivos com espaços no nome, diferentemente da maioria das outras.Eu sei que isso não fazia parte dos nomes de arquivos de exemplo, mas é fácil escrever comandos shell que não lidam com espaços com segurança, então eu queria fazer isso neste exemplo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top