3

我有 16,000 张来自 webcan 屏幕抓取器的 jpg,我让它们运行了一年,指向后一年。我想找到一种方法来抓取每 4 个图像,以便我可以将它们放入另一个目录,以便以后将它们变成电影。linux下是否有一个简单的bash脚本或其他方式可以做到这一点。

他们的名字是这样的......

frame-44558.jpg

frame-44559.jpg

frame-44560.jpg

frame-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 线以使其使用所有图像?

4

8 回答 8

13

一种简单的方法是:

$ touch abcdefghijklmnopqrstu vwxyz
$ mv $(ls | awk '{nr++; if (nr % 4 == 0) print $0}') destdir

于 2008-09-16T12:45:22.023 回答
2

创建一个包含以下内容的脚本 move.sh:

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

使其可执行,然后在文件夹中执行此操作:

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

这需要文件名列表,一次将四个传递给 move.sh,然后忽略前三个并将第四个移动到新文件夹中。

即使数字不完全按顺序,这也会起作用(例如,如果缺少某些帧编号,则使用 mod 4 算法将不起作用)。

于 2008-09-16T12:46:35.280 回答
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
于 2008-09-16T14:46:17.940 回答
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) ,这也将起作用

于 2008-09-16T12:43:50.200 回答
1
seq -f 'frame-%g.jpg' 1 4 number-of-frames

…将打印您需要的文件的名称。

于 2008-09-16T12:48:09.473 回答
1

鉴于masto关于排序的警告:

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

我喜欢这个解决方案的一点是,一切都在按照它的设计目的做,所以对我来说感觉很单一。

于 2008-09-16T14:38:44.417 回答
0

只需遍历文件列表:

files=( frame-*.jpg )
i=0
while [[ $i -lt ${#files} ]] ; do
  cur_file=${files[$i]}
  mungle_frame $cur_file
  i=$( expr $i + 4 )
done
于 2008-09-16T12:52:51.863 回答
0

这很俗气,但它应该可以完成工作。假设您当前 cd'd 进入包含所有文件的目录:

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

假设您的sort -n文件名并非都具有相同的位数;否则ls将按词汇顺序排序,frame-123.jpgframe-4.jpg认为这不是你想要的。

请小心,在尝试我的解决方案之前备份您的文件等。我不想为您丢失一年的数据负责。

请注意,与大多数其他解决方案不同,此解决方案确实处理名称中带有空格的文件。我知道这不是示例文件名的一部分,但是很容易编写不能安全处理空格的 shell 命令,所以我想在这个示例中这样做。

于 2008-09-16T12:58:55.030 回答