删除目录中除扩展名为 pdf 的文件之外的所有文件

删除目录中除扩展名为 pdf 的文件之外的所有文件

我有一个包含以下内容的目录:

x.pdf
y.zip
z.mp3
a.pdf

我想删除除 和 之外的所有文件x.pdfa.pdf如何从终端执行此操作?没有子目录,因此不需要任何递归。

答案1

cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
  • 第一个命令将带你进入要删除文件的目录
  • .pdf第二条命令将删除除文件名以 结尾的文件之外的所有文件

例如,如果temp您的主文件夹中有一个名为的目录:

cd ~/temp

然后删除文件:

find . -type f ! -iname "*.pdf" -delete

这将删除除 之外的所有文件xyz.pdf

您可以将这两个命令组合起来以执行以下操作:

find ~/temp -type f ! -iname "*.pdf" -delete

.是当前目录。!表示获取除.pdf末尾带有 的文件之外的所有文件。-type f仅选择文件,不选择目录。-delete表示删除它。

注意:此命令将删除当前目录以及所有子目录中的所有文件(pdf 文件除外,但包括隐藏文件)。!必须在 之前-name-name仅包含.pdf,而-iname将同时包含.pdf.PDF

要仅在当前目录中删除而不在子目录中删除,请添加-maxdepth 1

find . -maxdepth 1 -type f ! -iname "*.pdf" -delete

答案2

使用bash的扩展 shell 通配符,你可以删除除.pdf使用

rm -- *.!(pdf)

正如@pts 所指出的,--字符表示任何命令选项的结束,在文件名称以字符开头的极少数情况下,确保命令的安全-

如果您想要删除没有任何扩展名的文件以及扩展名以外的文件.pdf,那么正如@DennisWilliamson 指出的那样,您可以使用

rm -- !(*.pdf)

扩展通配符应该默认启用,但如果没有,你可以使用

shopt -s extglob

特别是如果你打算在脚本中使用它,需要注意的是,如果表达式不匹配任何东西(即如果目录中没有非 pdf 文件),那么默认情况下,glob 将不展开地传递给命令rm,从而导致类似这样的错误

rm: cannot remove `*.!(pdf)': No such file or directory

您可以使用 shell 选项修改此默认行为nullglob,但这有其自身的问题。有关更详细的讨论,请参阅NullGlob - Greg 的维基

答案3

删除至垃圾箱

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)

或者通过mv命令(但这种方式你不能从垃圾中恢复它,因为它不记录.trashinfo信息,所以这意味着你将文件移动到了一个目的地如下所示)。

mv !(*.pdf) ~/.local/share/Trash/files

答案4

使用 bash 的 GLOBIGNORE:

GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE

来自 bash 的手册页:

格洛比诺尔:

            定义集合的模式的冒号分隔列表
            路径名扩展忽略的文件名。

快速测试:

mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *

输出:

压缩包
mp3

相关内容