我从网络扫描的screeb抓取器中获得了16,000个jpg,我让它跑了一年指向后面的一年。我想找到一种方法来抓取每个第四张图像,这样我就可以把它们放到另一个目录中,这样我以后就可以将它们变成一部电影了。在Linux下是否有一个简单的bash脚本或其他方法,我可以这样做。
他们的名字就是这样......
框-44558.jpg
框-44559.jpg
框-44560.jpg
框-44561.jpg
感谢新手需要帮助。
似乎已经奏效了。 在我的原始帖子中的几个错误。实际上有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 ++; if(nr%10 == 0)print $ 0}')../ newdirectory /似乎已经复制了图像。从它的外观每天70-900。
现在我正在跑步 mencoder mf://*.jpg -mf w = 640:h = 480:fps = 30:type = jpg -ovc lavc -lavcopts vcodec = msmpeg4v2 -nosound -o ../ output-msmpeg4v2.avi
我会让你知道电影是如何运作的。
更新:电影不起作用。 即使该目录也有2008,也只有2007年的图像。 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行以便它使用所有图像?
答案 0 :(得分:12)
一种简单的方法是:
$ 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
答案 1 :(得分:2)
创建一个包含以下内容的脚本move.sh:
#!/bin/sh
mv $4 ../newdirectory/
使其可执行,然后在文件夹中执行此操作:
ls *.jpg | xargs -n 4 ./move.sh
这将获取文件名列表,一次传递四个到move.sh,然后忽略前三个并将第四个移动到一个新文件夹中。
即使数字不是完全按顺序排列(例如,如果缺少某些帧数,那么使用mod 4算法将无效),这将有效。
答案 2 :(得分:2)
根据建议,您应该使用
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
答案 3 :(得分:1)
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
)
答案 4 :(得分:1)
seq -f 'frame-%g.jpg' 1 4 number-of-frames
...将打印您需要的文件名称。
答案 5 :(得分:1)
鉴于masto关于排序的警告:
ls | sed -n '1~4 p' | xargs -i mv {} ../destdir/
我喜欢这个解决方案的是,所有东西都在按照它的设计目的去做,所以对我来说感觉不合适。
答案 6 :(得分:0)
只需遍历文件列表:
files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
cur_file=${files[$i]}
mungle_frame $cur_file
i=$( expr $i + 4 )
done
答案 7 :(得分:0)
这非常俗气,但它应该完成工作。假设您当前已进入包含所有文件的目录:
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
之前的词汇顺序进行排序,而我认为这不是你想要的。
请小心,在尝试我的解决方案之前备份您的文件等。我不想为您丢失一年的数据负责。
请注意,此解决方案确实处理名称中包含空格的文件,这与其他大多数文件不同。我知道这不是示例文件名的一部分,但是编写不能安全处理空间的shell命令很容易,所以我想在这个例子中这样做。