2008-09-16 16 views
3

Ich habe 16.000 jpg's von einem WebCrean Grabber, die ich laufen lassen für ein Jahr in das Jahr zurück zeigen. Ich möchte einen Weg finden, jedes vierte Bild zu erfassen, damit ich es dann in ein anderes Verzeichnis einfügen kann, damit ich es später in einen Film verwandeln kann. Gibt es ein einfaches Bash-Skript oder eine andere Möglichkeit unter Linux, dass ich das machen kann?Grabbing jede 4. Datei

Sie sind wie so genannt ......

Rahmen-44558.jpg

Rahmen-44559.jpg

Rahmen-44560.jpg

Rahmen-44561. jpg

Danke von einem Newb, der Hilfe braucht.


Scheint gearbeitet zu haben. Einige Fehler in meinem ursprünglichen Post. Es gab tatsächlich 280.000 Bilder und die Namensgebung war. /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163405.jpg /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163505.jpg /home/Glatzkopf/Desktop/webcamimages/webcam_2007-05-29_163605. jpg

Ich lief. cp $ (ls | awk '{nr ++; wenn (nr% 10 == 0) drucke $ 0}') ../newdirectory/

Die scheint die Bilder kopiert zu haben. 70-900 pro Tag von dem Aussehen davon.

Jetzt ich bin mit mencoder mf: //*.jpg -mf w = 640: h = 480: fps = 30: type = jpg -ovc lavc -lavcopts vcodec = msmpeg4v2 -nosound -o ../ output-msmpeg4v2.avi

Ich werde Sie wissen lassen, wie der Film funktioniert.

UPDATE: Film hat nicht funktioniert. Nur Bilder von 2007 drin, obwohl das Verzeichnis auch 2008 hat. 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

Wie kann ich meine mencoder Zeile ändern, so dass sie alle Bilder verwendet?

Antwort

11

Ein einfacher Weg ist:

 
$ 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 

+6

Vielleicht sollten Sie darauf hinweisen, dass die erste Zeile nicht notwendig ist, schafft es nur Beispieldaten ... – Sklivvz

1

Eine einfache Möglichkeit, in Perl (wahrscheinlich leicht an bash) ist die Dateinamen in einem Array glob dann die Sequenznummer erhalten und diejenigen zu entfernen, die von 4 druckt nicht teilbar sind

So etwas wie dies die Dateien, die Sie Bedarf:

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

Sie den Druck durch eine Bewegung ersetzen können ...

das funktioniert, wenn die Dateien in der Reihenfolge nummeriert sind, auch wenn die Anzahl der Stellen nicht konstant ist wie file_9.jpg gefolgt von file_10.jpg)

2

ein Skript Bewegung erstellen.sh, die enthält diese:

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

ausführbar machen und dann tun dies in dem Ordner:

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

Diese Liste der Dateinamen nimmt, geht vier auf einmal in move.sh, die dann ignoriert die ersten drei und verschiebt den vierten in einen neuen Ordner.

Dies funktioniert auch, wenn die Zahlen nicht genau in der Reihenfolge sind (z. B. wenn einige Rahmennummern fehlen, dann funktioniert die Verwendung von Mod 4 Arithmetik nicht).

+0

ls * .jpg | xargs -n 10 ./copy.sh bash:/bin/ls: Argumentliste zu lang cp: can not stat '0 ': Keine solche Datei oder Verzeichnis – user11950

+0

Ich habe einen Fehler gemacht. Es gab 280.000 Bilder :) – user11950

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

... werden die Namen der Dateien gedruckt, die Sie benötigen.

0

iterieren einfach eine Liste von Dateien über:

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

Ich habe 'files = (frame - *. Jpg)' nicht verstanden, was macht das? Ich habe es in einer Shell versucht und es gab mir nur einen Dateinamen, der der Variablen zugewiesen wurde – baxx

0

Das ist ziemlich kitschig, aber es sollte den Job erledigen. Vorausgesetzt, dass Sie gerade in das Verzeichnis cd'd alle Dateien enthält:

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

Die sort -n ist es Ihre Dateinamen haben nicht alle die gleiche Anzahl von Ziffern angenommen; sonst wird ls in lexikalischer Reihenfolge sortieren, wo frame-123.jpg vor frame-4.jpg kommt und ich glaube nicht, dass Sie das wollen.

Bitte seien Sie vorsichtig, sichern Sie Ihre Dateien, bevor Sie meine Lösung ausprobieren usw. Ich möchte nicht dafür verantwortlich sein, dass Sie ein Jahr Daten verlieren.

Beachten Sie, dass diese Lösung im Gegensatz zu den meisten anderen Dateien mit Leerzeichen im Namen behandelt. Ich weiß, dass das nicht Teil der Beispieldateinamen war, aber es ist einfach, Shellbefehle zu schreiben, die nicht sicher mit Leerzeichen umgehen, also wollte ich das in diesem Beispiel tun.

1

Bei masto der Einsprüche über Sortierung:

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

Das, was ich über diese Lösung gefällt ist, dass alles zu tun, was es zu tun wurde entwickelt, um, so dass es mir fühlt sich Unixy.

2

Wie vorgeschlagen, Sie

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

zu erzeugen, um die Liste der Dateinamen verwenden sollten, da ‚ls‘ auf 280k-Dateien fehlschlagen. So dass die endgültige Lösung so etwas wie wäre:

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