2008-09-16 8 views
3

J'ai 16 000 jpg d'une carte d'acquisition Webcan que j'ai laissé courir pendant un an. Je veux trouver un moyen de saisir chaque 4ème image pour pouvoir ensuite les placer dans un autre répertoire afin de pouvoir les transformer en film. Y a-t-il un script bash simple ou un autre moyen sous linux que je peux faire ceci.Saisir tous les 4 fichiers

Ils sont nommés comme si ......

cadre 44558.jpg

cadre 44559.jpg

cadre 44560.jpg

cadre 44561. jpg

Merci d'un newb ayant besoin d'aide.


Semble avoir travaillé. Couple d'erreurs dans mon post origonal. Il y avait en fait 280 000 images et le nom était. /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163405.jpg /home/baldy/Desktop/webcamimages/webcam_2007-05-29_163505.jpg /home/baldy/Bureau/webcamimages/webcam_2007-05-29_163605. jpg

J'ai couru. cp $ (ls | awk '{nr ++; if (nr% 10 == 0) print $ 0}')/nouveau répertoire/

Qui semble avoir copié les images. 70-900 par jour à partir de l'apparence de celui-ci.

Maintenant, je suis en mencoder mf: //*.jpg -mf w = 640 h = 480: fps = 30: type = jpg -ovc lavc -lavcopts vcodec = msmpeg4v2 -nosound -o ../ output-msmpeg4v2.avi

Je vous ferai savoir comment fonctionne le film.

MISE À JOUR: Le film n'a pas fonctionné. A seulement des images de 2007 dedans bien que le répertoire ait 2008 aussi bien. 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

Comment puis-je modifier ma ligne mencoder afin qu'elle utilise toutes les images?

Répondre

11

Une façon simple est:

 
$ 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

Peut-être que vous devriez remarquer que la première ligne n'est pas nécessaire, il suffit de créer des données échantillons ... – Sklivvz

1

Un moyen facile en Perl (probablement facilement adaptable à bash) est à glob les noms de fichiers dans un tableau, puis obtenir le numéro de séquence et de supprimer ceux qui ne sont pas divisibles par 4

Quelque chose comme ceci affichera les fichiers que vous besoin:

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

Vous pouvez remplacer l'impression par un mouvement ...

Cela fonctionnera si les fichiers sont numérotés dans l'ordre, même si le nombre de chiffres n'est pas constante comme file_9.jpg parsuivie)

2

Créer un mouvement de script.sh qui contient ceci:

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

le rendre exécutable, puis le faire dans le dossier:

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

Cela prend la liste des noms de fichiers, passe quatre à la fois dans move.sh, qui puis ignores les trois premiers et déplace le quatrième dans un nouveau dossier.

Ceci fonctionnera même si les numéros ne sont pas exactement en séquence (par exemple, si certains numéros de trame sont manquants, alors l'utilisation de l'arithmétique mod 4 ne fonctionnera pas).

+0

ls * .jpg | xargs -n 10 ./copy.sh bash:/bin/ls: Liste d'arguments trop longue cp: ne peut pas stat '0 ': aucun fichier ou répertoire de ce type – user11950

+0

J'ai fait une erreur. Il y avait 280 000 images :) – user11950

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

... affichera les noms des fichiers dont vous avez besoin.

0

Juste itérer sur une liste de fichiers:

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

Je n'ai pas compris 'files = (frame - *. Jpg)', qu'est-ce que ça fait? Je l'ai essayé dans un shell et il m'a seulement donné un nom de fichier assigné à la variable – baxx

0

C'est assez ringard, mais il devrait faire le travail. En supposant que vous êtes actuellement cd'd dans le répertoire contenant tous vos fichiers:

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

Le sort -n est là en supposant que vos noms n'ont pas tous le même nombre de chiffres; sinon ls va trier dans l'ordre lexical où frame-123.jpg vient avant frame-4.jpg et je ne pense pas que ce soit ce que vous voulez.

Soyez prudent, sauvegardez vos fichiers avant d'essayer ma solution, etc. Je ne veux pas être responsable de la perte d'une année de données.

Notez que cette solution gère les fichiers avec des espaces dans le nom, contrairement à la plupart des autres. Je sais que cela ne faisait pas partie des exemples de noms de fichiers, mais il est facile d'écrire des commandes shell qui ne gèrent pas les espaces en toute sécurité, donc je voulais le faire dans cet exemple.

1

mises en garde de GIVEN Masto sur le tri:

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

La chose que j'aime cette solution est que tout est fait ce qu'il a été conçu pour faire, il se sent unixy pour moi.

2

Comme le suggère, vous devez utiliser

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

pour générer la liste des noms de fichiers depuis ls 'échouera sur 280K fichiers. Donc, la solution finale serait quelque chose comme:

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