抓取第4个文件
我有一个来自webcan抓屏器的16,000 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)打印$ 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行,使其使用所有图像?
解决方案
回答
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
,即使文件按顺序编号,这也将起作用
回答
一种简单的方法是:
$ 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#!/bin/sh mv ../newdirectory/}') destdir
回答
创建一个包含以下内容的脚本move.sh:
ls *.jpg | xargs -n 4 ./move.sh
使它可执行,然后在文件夹中执行此操作:
seq -f 'frame-%g.jpg' 1 4 number-of-frames
这将获取文件名列表,一次将四个文件传递到move.sh,然后忽略前三个文件,并将第四个文件移动到新文件夹中。
即使数字顺序不正确也可以使用(例如,如果缺少某些帧号,则无法使用mod 4算术)。
回答
files=( frame-*.jpg ) i=0 while [[ $i -lt ${#files} ]] ; do cur_file=${files[$i]} mungle_frame $cur_file i=$( expr $i + 4 ) done
将打印所需文件的名称。
回答
只需遍历文件列表即可:
mkdir ../outdir ls | sort -n | while read fname; do mv "$fname" ../outdir/; read; read; read; done
回答
这很俗气,但是应该可以完成工作。假设我们当前已进入包含所有文件的目录:
seq -f 'frame-%g.jpg' 1 4 number-of-frames
这里的-sort -n假设文件名的位数不全相同;否则," ls"将按词法顺序排序,其中" frame-123.jpg"位于" frame-4.jpg"之前,我认为这不是我们想要的。
请小心,在尝试我的解决方案之前备份文件,等等。对于我们丢失一年的数据价值,我不承担任何责任。
请注意,与其他大多数解决方案不同,此解决方案确实处理名称中带有空格的文件。我知道这不是示例文件名的一部分,但是编写不能安全处理空格的shell命令很容易,因此在此示例中我想这样做。
回答
考虑到masto关于排序的警告:
ls | sed -n'1〜4 p'| xargs -i mv {} ../ destdir /
我喜欢这种解决方案的地方是,一切都按照设计的方式进行,所以对我来说感觉不统一。
回答
根据建议,我们应该使用
for f in `seq -f 'frame-%g.jpg' 1 4 number-of-frames` ; do mv $f destdir/ done
生成文件名列表,因为" ls"在280k文件上将失败。所以最终的解决方案是这样的:
##代码##