Domanda

Ho 16.000 jpg da uno screeb grabber webcan che ho lasciato funzionare per un anno puntando all'anno precedente.Voglio trovare un modo per catturare ogni quarta immagine in modo da poterla inserire in un'altra directory in modo da poterla successivamente trasformare in un film.Esiste un semplice script bash o un altro modo sotto Linux per farlo.

Si chiamano così....

frame-44558.jpg

frame-44559.jpg

frame-44560.jpg

frame-44561.jpg

Grazie da un principiante che ha bisogno di aiuto.


Sembra aver funzionato.Un paio di errori nel mio post originale.In realtà c'erano 280.000 immagini e il nome era./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

Ho corso.cp $(ls | awk '{nr++;if (nr % 10 == 0) print $0}') ../nuovadirectory/

Che sembra aver copiato le immagini.70-900 al giorno a quanto pare.

Ora sto eseguendo mencoder mf: //*.jpg -mf w = 640: h = 480: fps = 30: type = jpg -ovc lavc -lavcopts vcodec = msmpeg4v2 -nosound -o ../output-msmpg4v2.avi

Ti farò sapere come andrà a finire il film.

AGGIORNAMENTO:Il film non ha funzionato.Contiene solo immagini del 2007 anche se la directory contiene anche immagini del 2008.webcam_2008-02-17_101403.jpg webcam_2008-03-27_192205.jpg webcam_2008-02-02-17_102403.jpg webcam_2008-03-27_193205.jpg Webcam_2008-02-17_103434343403.jpg. G webcam_2008-02-17_104403.jpg Webcam_2008 -03-27_195205.jpg

Come posso modificare la mia linea mencoder in modo che utilizzi tutte le immagini?

È stato utile?

Soluzione

Un modo semplice è:

$ 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

Altri suggerimenti

Crea uno script move.sh che contenga questo:

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

Rendilo eseguibile e poi fallo nella cartella:

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

Questo prende l'elenco dei nomi dei file, ne passa quattro alla volta in move.sh, che poi ignora i primi tre e sposta il quarto in una nuova cartella.

Funzionerà anche se i numeri non sono esattamente in sequenza (ad es.se mancano alcuni numeri di frame, l'utilizzo dell'aritmetica mod 4 non funzionerà).

Come suggerito, dovresti usare

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

per generare l'elenco dei nomi dei file poiché 'ls' fallirà sui file da 280k.Quindi la soluzione finale sarebbe qualcosa del tipo:

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

...stamperà i nomi dei file necessari.

Un modo semplice in perl (probabilmente facilmente adattabile a bash) è quello di raggruppare i nomi dei file in un array, quindi ottenere il numero di sequenza e rimuovere quelli che non sono divisibili per 4

Qualcosa di simile stamperà i file necessari:

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

Puoi sostituire la stampa con una mossa...

Funzionerà se i file sono numerati in sequenza anche se il numero di cifre non è costante come file_9.jpg seguito da file_10.jpg )

Date le avvertenze di Masto sull'ordinamento:

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

La cosa che mi piace di questa soluzione è che tutto fa ciò per cui è stato progettato, quindi mi sembra strano.

Basta scorrere un elenco di file:

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

Questo è piuttosto banale, ma dovrebbe portare a termine il lavoro.Supponendo che tu sia attualmente inserito nella directory contenente tutti i tuoi file:

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

IL sort -n si presuppone che i nomi dei file non abbiano tutti lo stesso numero di cifre;Altrimenti ls ordinerà in ordine lessicale dove frame-123.jpg viene prima frame-4.jpg e non penso che sia quello che vuoi.

Fai attenzione, esegui il backup dei file prima di provare la mia soluzione, ecc.Non voglio essere responsabile della tua perdita di dati di un anno.

Tieni presente che questa soluzione gestisce i file con spazi nel nome, a differenza della maggior parte delle altre.So che non faceva parte dei nomi di file di esempio, ma è facile scrivere comandi di shell che non gestiscono gli spazi in modo sicuro, quindi volevo farlo in questo esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top