如何从shell命令中删除目录中的每个其他文件?

时间:2012-09-26 14:45:43

标签: linux shell command-line

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

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

依旧......

我想使用shell命令从dir中删除所有其他帧,该怎么做?

修改

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

rm filename.png
rm filename2.png

等...

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

6 个答案:

答案 0 :(得分:26)

这应该可以解决问题:

rm -f *[13579].png

将消除名称以“1”或“3”或“5”或“7”或“9”加尾随“.png”结尾的每个文件。

注意:*代表0 or more characters使用1.png,因此foo1.png会匹配,{{1}}

答案 1 :(得分:22)

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

有很多方法可以达到预期的效果。

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

假设所有其他意味着文件的结尾数字为1,3,5,7或9,那么这就解决了你的问题

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

答案 4 :(得分:0)

除了什么? 您可以使用*删除多个帧。例如rm -f * .png删除所有。

答案 5 :(得分:0)

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

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

注意,这意味着当前目录。

它是一样的,但更安全:

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

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

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