如何使用Shell命令删除目录中每隔一个文件?

19

我已经从视频中提取出了以png格式保存的帧:

00000032.png
00000033.png
00000034.png
00000035.png
00000036.png
00000037.png

我想使用 shell 命令从目录中删除每隔一个帧,该怎么做?

编辑

我认为我的问题没有表述清楚。我知道可以手动删除每个文件,例如:

rm filename.png
rm filename2.png

因为文件夹中有数千个图像,所以我需要动态地在一个命令中完成所有操作。


数字是否严格连续? - Jens
6个回答

43
这个应该管用:
rm -f *[13579].png

这将删除所有以13579结尾并带有.png后缀的文件。

注意:*在模式匹配中表示0个或多个字符,所以foo1.png将被删除,但1.png也将被删除。


2
请将此答案设为被采纳的答案,因为它比这里的其他所有内容都更短、更易记。 - rien333
1
这是我喜欢从技术宅那里得到的聪明且快速的解决方案! :) - Mathias

29
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

有很多方法可以实现您想要的结果。


1
这很好,因为它不依赖于数字是否连续……不过我不确定有多少人会想在那种情况下这样做。啊……*.png是否保证按字母顺序返回文件?如果不是,这将无法工作。 - Beska
@Beska:在你评论时,我编辑了答案并注明了这一点。非连续数字的一个可能原因是——你已经筛选掉了一半的文件(之前运行过一次)。 - Jonathan Leffler
@Jonathan Leffler 谢谢,这是一个更完善的解决方案,但现在我选择使用 rm -f *[13579].png,因为文件名总是由我使用的程序连续生成的。 - user967451
@Beska:shell通配符运算符按当前语言环境返回已排序的名称。 因此,*.png会以排序顺序返回名称。 - Jonathan Leffler

5
rm ???????1.png
rm ???????3.png
rm ???????5.png
rm ???????7.png
rm ???????9.png

在尝试之前,请备份数据!将“rm”替换为“erase”以适用于dos/windows。


好的,我已经为Linux更改了它。通配符“?”的好处是它在DOS上应该可以正常工作。 - Benny Smith

1
假设其他方式的文件以数字1、3、5、7或9结尾,那么这就解决了你的问题。
find . -regex '.*[13579]\.png' -exec rm {} \;

-1

这个小脚本会删除所有的 png 文件:

$ find . -name "*.png" -exec /bin/rm {} \;

注意,它表示当前目录。

这样做相同,但更安全:

$ find . -name "*.txt" -delete:

现在,删除所有没有 png 扩展名的文件:

$ find  . ! -name "*.png" -type f -delete

2
问题不在于删除所有文件;问题在于删除其中一半。在一个充满*.png文件的目录中执行“删除所有*.txt文件”肯定更安全。您还可以使用尾随的+而不是\;来实现带有find的类似于xargs的效果。 - Jonathan Leffler
使用find删除文件时要非常小心... 例如,此命令不仅会在当前目录上操作,而且会递归地处理当前目录下的所有内容。 - agentp

-1

除了什么?您可以使用 * 来删除多个框架。例如,rm -f *.png 可以删除所有文件。


5
“删除每隔一个(object-type)”的英文意思是删除一个,不删除下一个,再删除一个,不删除下一个,依此类推。” - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接