抓住每第4个文件

时间:2008-09-16 12:40:11

标签: bash scripting

我从网络扫描的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行以便它使用所有图像?

8 个答案:

答案 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命令很容易,所以我想在这个例子中这样做。