【问题标题】:How to delete every other file in a directory from a shell command?如何从 shell 命令中删除目录中的所有其他文件?
【发布时间】:2012-09-26 14:45:43
【问题描述】:

我已从 png 格式的视频中提取帧:

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

等等……

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

编辑

我想我的问题并不清楚。我知道我可以手动删除每个文件,例如:

rm filename.png
rm filename2.png

等等……

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

【问题讨论】:

  • 数字是否严格连续?

标签: linux shell command-line


【解决方案1】:

这应该可以解决问题:

rm -f *[13579].png

这将消灭所有名称以“1”或“3”或“5”或“7”或“9”结尾加上尾随“.png”的文件。

注意:模式中使用的* 代表0 or more characters,所以1.png 会匹配,但foo1.png 也会匹配

【讨论】:

  • 请将此作为公认的答案,这样比这里的其他所有内容更短,更容易记住
【解决方案2】:
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 是否保证按字母顺序返回文件?如果没有,这将不起作用。
  • @Beska:我在您发表评论时编辑了答案以准确指出这一点。数字不连续的一个可能原因 - 您已经清除了一半的文件(之前运行过一次)。
  • @Jonathan Leffler 感谢这是一个更完整的证明解决方案,但现在我使用 rm -f *[13579].png 因为文件名总是连续的,正如我正在使用的程序所呈现的那样.
  • @Beska:shell glob 运算符使用当前语言环境按排序顺序返回名称。因此,*.png 将按排序顺序返回名称。
【解决方案3】:
rm ???????1.png
rm ???????3.png
rm ???????5.png
rm ???????7.png
rm ???????9.png

(但在尝试之前先备份!)。将 dos/windows 的“rm”替换为“erase”。

【讨论】:

  • 好的,我为linux改了。的好处?通配符是否应该在 DOS 上工作。
【解决方案4】:

假设所有其他表示文件的结尾数字为 1、3、5、7 或 9,那么这就解决了您的问题

find . -regex '.*[13579]\.png' -exec rm {} \;

【讨论】:

    【解决方案5】:

    除了什么? 您可以使用 * 删除多个帧。比如 rm -f *.png 全部删除。

    【讨论】:

    • 英文中,'delete every other object-type'表示删除一个,不删除下一个,删除一个,不删除下一个,依此类推。
    【解决方案6】:

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

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

    注意,表示当前目录。

    相同,但更安全:

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

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

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

    【讨论】:

    • 问题是不是要删除所有文件;问题是要删除其中的一半。在充满*.png 文件的目录中“删除所有*.txt 文件”当然更安全。您还可以使用尾随+ 而不是\; 来实现xargs 类似find 的效果。
    • 使用 find 删除东西时要非常小心。例如,这不仅在当前目录上运行,而且在当前目录下的所有内容上递归。
    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2012-03-05
    • 2018-07-03
    相关资源
    最近更新 更多