我已经从视频中提取出了以png格式保存的帧:
00000032.png
00000033.png
00000034.png
00000035.png
00000036.png
00000037.png
我想使用 shell 命令从目录中删除每隔一个帧,该怎么做?
编辑
我认为我的问题没有表述清楚。我知道可以手动删除每个文件,例如:
rm filename.png
rm filename2.png
因为文件夹中有数千个图像,所以我需要动态地在一个命令中完成所有操作。
我已经从视频中提取出了以png格式保存的帧:
00000032.png
00000033.png
00000034.png
00000035.png
00000036.png
00000037.png
我想使用 shell 命令从目录中删除每隔一个帧,该怎么做?
我认为我的问题没有表述清楚。我知道可以手动删除每个文件,例如:
rm filename.png
rm filename2.png
因为文件夹中有数千个图像,所以我需要动态地在一个命令中完成所有操作。
rm -f *[13579].png
这将删除所有以1
或3
或5
或7
或9
结尾并带有.png
后缀的文件。
注意:*
在模式匹配中表示0个或多个字符
,所以foo1.png
将被删除,但1.png
也将被删除。
delete=yes
for file in *.png
do
if [ $delete = yes ]
then rm -f $file; delete=no
else delete=yes
fi
done
即使文件上的数字不连续,这也会强制执行严格的交替。你可以选择使用xargs
来加快速度:
delete=yes
for file in *.png
do
if [ $delete = yes ]
then echo $file; delete=no
else delete=yes
fi
done |
xargs rm -f
你的名字看起来很正常(没有空格或其他奇怪字符需要处理),因此您不必担心一些真正通用工具需要处理的微小细节。您甚至可以使用以下代码:
ls *.png |
awk 'NR % 2 == 1 { print }' |
xargs rm -f
有很多方法可以实现您想要的结果。
*.png
会以排序顺序返回名称。 - Jonathan Lefflerrm ???????1.png
rm ???????3.png
rm ???????5.png
rm ???????7.png
rm ???????9.png
在尝试之前,请备份数据!将“rm”替换为“erase”以适用于dos/windows。
find . -regex '.*[13579]\.png' -exec rm {} \;
这个小脚本会删除所有的 png 文件:
$ find . -name "*.png" -exec /bin/rm {} \;
注意点,它表示当前目录。
这样做相同,但更安全:
$ find . -name "*.txt" -delete:
现在,删除所有没有 png 扩展名的文件:
$ find . ! -name "*.png" -type f -delete
*.png
文件的目录中执行“删除所有*.txt
文件”肯定更安全。您还可以使用尾随的+
而不是\;
来实现带有find
的类似于xargs
的效果。 - Jonathan Leffler除了什么?您可以使用 * 来删除多个框架。例如,rm -f *.png 可以删除所有文件。