我从 png 格式的视频中提取了帧:
00000032.png
00000033.png
00000034.png
00000035.png
00000036.png
00000037.png
等等...
我想使用 shell 命令从目录中删除所有其他帧,该怎么做?
编辑
我想我的问题并不清楚。我知道我可以手动删除每个文件,例如:
rm filename.png
rm filename2.png
ETC...
我需要在一个命令中动态地完成所有这些操作,因为文件夹中有数千张图像。
我从 png 格式的视频中提取了帧:
00000032.png
00000033.png
00000034.png
00000035.png
00000036.png
00000037.png
等等...
我想使用 shell 命令从目录中删除所有其他帧,该怎么做?
我想我的问题并不清楚。我知道我可以手动删除每个文件,例如:
rm filename.png
rm filename2.png
ETC...
我需要在一个命令中动态地完成所有这些操作,因为文件夹中有数千张图像。
这应该可以解决问题:
rm -f *[13579].png
这将消灭每个名称以“1”或“3”或“5”或“7”或“9”加上尾随“.png”结尾的文件。
注意:*用于模式代表0 or more charactersso 1.pngwill match but so wouldfoo1.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
有很多方法可以达到您想要的结果。
rm ???????1.png
rm ???????3.png
rm ???????5.png
rm ???????7.png
rm ???????9.png
(但在尝试之前先备份!)。将 dos/windows 的“rm”替换为“erase”。
假设所有其他意味着文件的结尾数字为 1、3、5、7 或 9,那么这可以解决您的问题
find . -regex '.*[13579]\.png' -exec rm {} \;
除了什么?您可以使用 * 删除多个帧。例如 rm -f *.png 删除所有。
这个小脚本删除所有 png 文件:
$ find . -name "*.png" -exec /bin/rm {} \;
注意点,表示当前目录。
它是相同的,但更安全:
$ find . -name "*.txt" -delete:
现在,删除所有没有png 扩展名的文件:
$ find . ! -name "*.png" -type f -delete