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

6ojccjat  于 2023-10-23  发布在  Shell
关注(0)|答案(6)|浏览(141)

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

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

等等
我想使用shell命令从目录中删除每隔一个帧,如何操作?

编辑

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

rm filename.png
rm filename2.png

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

i1icjdpr

i1icjdpr1#

这应该可以解决问题:

rm -f *[13579].png

这将消除每个文件的名称结束13579加上尾随.png后缀。
注意:模式中使用的*匹配0 or more characters,因此foo1.png将被删除,但1.png也将被删除。

qeeaahzv

qeeaahzv2#

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

有很多方法可以达到你想要的结果。

huwehgph

huwehgph3#

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

(but在尝试之前做一个备份!)。对于dos/windows,将“rm”改为“erase”。

vtwuwzda

vtwuwzda4#

假设每隔一个意味着文件结束数字1,3,5,7或9,那么这就解决了你的问题

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

ivqmmu1c5#

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

vc6uscn9

vc6uscn96#

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

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

注意,它表示当前目录。
这是相同的,但更安全:

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

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

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

相关问题