题
我有16 000名jpg是从一个webcan screeb抓我让运行于一年的指示进入后一年。我想找到一种方式来抓住每一个4号的图像这样,然后我就可以把它们放进另一个目录,所以我以后可以把它们变成一部电影。是有一个简单的bash脚本或其他方式在linux下,我可以做到这一点。
他们命名的。..
frame-44558.jpg
frame-44559.jpg
frame-44560.jpg
frame-44561.jpg
由于从一个福利局需要的帮助。
似乎已经奏效。夫妇中的错误我origonal员额。实际上有280,000个图像和名称。/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
我跑了。cp$(ls|awk'{nr++;如果(nr%10==0)print$0}')../newdirectory/
这似乎已复制了图像。70-900每天看起来它。
现在我运行 mencoder mf://*.jpg-mf w=640:h=480:fps=30:type=jpg-孤儿和易受感染儿童lavc-lavcopts禁=msmpeg4v2-nosound-o../输出msmpeg4v2.avi
我会让你知道怎样的电影作品。
更新:电影没有工作。只有图像从2007年在它即使目录已于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
我怎么可以修改我的mencoder线,以便它使用的所有图片吗?
解决方案
一个简单的方法是:
$ 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
其他提示
创建一个脚本move.sh 其中包含:
#!/bin/sh
mv $4 ../newdirectory/
使它可执行并且然后做这个文件夹:
ls *.jpg | xargs -n 4 ./move.sh
这需要列表的文件,通过四个在一段时间到move.sh,然后忽略了第三个移动的第四次进入一个新的文件夹。
这将工作,甚至如果这些数字是不完全的顺序(例如如果一些框架的数字是失踪,然后使用国防部4算赢得不工作)。
作为建议,应使用
seq -f 'frame-%g.jpg' 1 4 number-of-frames
生成列表的文件,因为'ls'将会失败280k文件。所以最终解决方案将是这样的:
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
...将打印的名字的文件需要。
一个简单的方法在perl(可能很容易地适应bash)是全局的文件名一阵然后获得序列号,并删除那些不可分割的,由4
这样的事情将打印所需文件:
ls -1 /path/to/files/ | perl -e 'while (<STDIN>) {($seq)=/(\d*)\.jpg$/; print $_ if $seq && $seq % 4 ==0}'
你可以替换打印通过一个移动...
这将工作,如果这些文件的编号顺序,即使数量的数字是非常喜欢 file_9.jpg
随后通过 file_10.jpg
)
给麦思通的需要注意关于排序:
ls | sed -n '1~4 p' | xargs -i mv {} ../destdir/
我喜欢这个方案是,一切都在做什么,它的目的是要做到,所以感觉unix给我。
只是迭代过列表的文件:
files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
cur_file=${files[$i]}
mungle_frame $cur_file
i=$( expr $i + 4 )
done
这是漂亮的俗气的,但是它应该完成工作。假设你在目前的cd会成目录包含所有的文件:
mkdir ../outdir
ls | sort -n | while read fname; do mv "$fname" ../outdir/; read; read; read; done
的 sort -n
有没有假设你的文件并不都具有同样数量的数字;否则 ls
将在词汇以便在那里 frame-123.jpg
来之前 frame-4.jpg
我不认为那是你想要什么。
请小心点,回你的文件,然后再尝试我的解决方案,等等。我不想对你负责丢失一年的数据。
注意,这个方案也处理文件与空中的名称,不同于大多数的其他人。我知道这不是样本的部分文件名,但它很容易写壳的命令不处理空间安全,所以我想这样做,在这个例子。