删除所有非 jpeg 文件

die*_*403 2 linux bash find xargs

我有练习,我必须删除所有文件,而不是jpeg.

我试过了find -type f |xargs file| grep -iv 'jpeg',但它不起作用。

Joh*_*024 7

根据文件 mimetype 删除

要删除当前目录或其子目录中的所有非 jpeg 常规文件,请使用:

find . -type f -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;
Run Code Online (Sandbox Code Playgroud)

这种方法对所有文件名都是安全的。即使文件名中有换行符或其他困难的字符,它也能工作。

这个怎么运作

  • find . -type f

    这将启动一个find命令,将找到的文件限制为常规文件-type f.

  • -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;

    对于找到的所有文件,这将运行 bash 命令来测试文件的类型。特别是,file -bi "$1" | grep -q image/jpeg如果file报告文件具有 mimetype ,则返回 true image/jpeg。操作员||确保rm仅对未通过 jpeg 测试的文件执行随后的命令。因此,所有非 jpeg 文件都将被删除。

根据文件名删除

要删除名称不以结尾的所有文件.jpeg

find . -type f ! -name '*.jpeg' -delete
Run Code Online (Sandbox Code Playgroud)

这种方法对于所有文件名也是安全的。即使文件名中有换行符或其他困难的字符,它也能工作。

这个怎么运作

  • find .

    查找当前目录及其子目录中的所有文件

  • -type f

    仅限于常规文件

  • ! -name '*.jpeg'

    -name '*.jpeg'将查找名称以.jpeg. !然而,感叹号表示否定。因此,! -name '*.jpeg'将我们的搜索限制为名称.jpeg.

  • -delete

    这告诉find删除符合上述条件的文件。

测试

要测试命令,请省略-delete

find . -type f ! -name '*.jpeg'
Run Code Online (Sandbox Code Playgroud)

这将显示-delete使用该操作时将删除哪些文件。