抓取第4个文件

时间:2020-03-05 18:55:48  来源:igfitidea点击:

我有一个来自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文件上将失败。所以最终的解决方案是这样的:

##代码##