删除linux终端中除一种类型之外的所有特定类型的文件

删除linux终端中除一种类型之外的所有特定类型的文件,linux,ubuntu,terminal,Linux,Ubuntu,Terminal,在我运行Ubuntu的计算机上,我有一个文件夹,里面有数百个文件,全部名为“index.html.n”,其中n从1开始,然后继续向上。其中一些文件是实际的html文件,一些是图像文件(png和jpg),还有一些是zip文件 我的目标是永久删除除zip存档之外的每个文件。我假设它是rm和file的某种组合,但我不确定确切的语法。首先find查找匹配的文件,然后file获取文件类型sed消除了其他文件类型,还从文件的输出中删除了除文件名以外的所有内容。最后,rm用于删除: find -name 'i

在我运行Ubuntu的计算机上,我有一个文件夹,里面有数百个文件,全部名为“index.html.n”,其中n从1开始,然后继续向上。其中一些文件是实际的html文件,一些是图像文件(png和jpg),还有一些是zip文件


我的目标是永久删除除zip存档之外的每个文件。我假设它是
rm
file
的某种组合,但我不确定确切的语法。

首先
find
查找匹配的文件,然后
file
获取文件类型
sed
消除了其他文件类型,还从
文件的输出中删除了除文件名以外的所有内容。最后,
rm
用于删除:

find -name 'index.html.[0-9]*' | \                
    xargs file | \                                
      sed -n 's/\([^:]*\): Zip archive.*/\1/p' |  
        xargs rm

如果它符合您的参数列表,并且没有包含冒号的文件名,那么使用
xargs
的简单管道应该可以:

file * | grep -vi zip | cut -d: -f1 | tr '\n' '\0' | xargs -0 rm
我会说:

for f in in index.html.*
do
  file "$f" | grep -qi zip
  [ $? -ne 0 ] && rm -i "$f"
done
如果你有足够的信心,请删除-i选项

for i in index.html.*
do
    $type = file $i;
    if [[ ! $file =~ "Zip" ]]
    then
        rm $file
    fi
done

出于测试目的,将
rm
更改为
ls
;它不是完全自动化的,但它比其他一些方法更不容易出错

file * > cleanup.sh

这将生成当前目录中所有文件(不包括点文件)或所有
index.html.
文件的列表,并将列表写入
cleanup.sh

使用您最喜欢的文本编辑器(我的恰好是vim),编辑
cleanup.sh

  • 添加
    #/bin/sh
    作为第一行
  • 删除包含字符串“
    Zip archive
    ”的所有行
  • 在每一行上,删除从
    到行尾的所有内容(在vim中,
    :%s/:.*$/
  • 将每行的开头替换为“
    rm
    ”,后跟空格
退出编辑器,更新文件

chmod +x cleanup.sh
您现在应该有一个shell脚本,它将删除除zip文件以外的所有内容

在运行脚本之前,请仔细检查它。注意拼写错误,以及名称中包含shell元字符的文件。您可能需要在文件名中添加引号

(请注意,如果以单行shell命令的形式执行此操作,则在实际删除文件之前,没有机会检查要删除的文件列表。)

一旦您确信脚本是正确的,请运行

./cleanup.sh

从您的shell提示符中。

zip文件也名为'index.html.n'吗?是的,它们都共享该名称。我相信
文件
命令会告诉您它实际上是哪种类型,我只是不确定如何使用该信息。可能的重复
./cleanup.sh