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

Sta*_*ers 49 command-line bash

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

x.pdf
y.zip
z.mp3
a.pdf
Run Code Online (Sandbox Code Playgroud)

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

Edw*_*lds 63

cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)
  • 第一个命令将带您到要删除文件的目录
  • 第二个命令将删除所有文件,除了那些以.pdffilename结尾的文件

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

cd ~/temp
Run Code Online (Sandbox Code Playgroud)

然后删除文件:

find . -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)

这将删除除xyz.pdf.

您可以将这两个命令组合起来:

find ~/temp -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)

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

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

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

find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
Run Code Online (Sandbox Code Playgroud)

  • [this](http://askubuntu.com/a/556211/158442) 提醒我我们应该使用 `-iname` 而不是 `-name`,否则以 `.PDF` 作为扩展名的文件将会滑动通过。 (3认同)

ste*_*ver 45

使用bash的扩展外壳通配符,您可以删除任何带有扩展名的文件,而不是.pdf使用

rm -- *.!(pdf)
Run Code Online (Sandbox Code Playgroud)

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

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

rm -- !(*.pdf)
Run Code Online (Sandbox Code Playgroud)

默认情况下应启用扩展通配符,但如果没有,您可以使用

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

特别是如果您打算在脚本中使用它,请务必注意,如果表达式不匹配任何内容(即,如果目录中没有非 pdf 文件),则默认情况下 glob 将未展开地传递给rm命令,导致类似的错误

rm: cannot remove `*.!(pdf)': No such file or directory
Run Code Online (Sandbox Code Playgroud)

您可以使用nullglobshell 选项修改此默认行为,但这有其自身的问题。有关更彻底的讨论,请参阅NullGlob - Greg's Wiki

  • 啊,星号也应该在里面:`!(*.py)`。此外,据推测,如果 OP 只希望保留“.pdf”文件,那么也应该删除没有扩展名的文件而不是忽略。 (4认同)

αғs*_*нιη 19

删除到垃圾箱

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
Run Code Online (Sandbox Code Playgroud)

或者通过mv命令(但通过这种方式,您无法从垃圾箱中恢复它,因为它不记录 .trashinfo 信息,因此这意味着您将文件移动到如下目的地)。

mv !(*.pdf) ~/.local/share/Trash/files
Run Code Online (Sandbox Code Playgroud)

  • 这种方法比直接使用 `rm` 安全得多。 (7认同)

小智 14

最简单的方法:在某处创建另一个目录(如果你只是在一个目录中删除,而不是递归,它甚至可以是一个子目录);将所有 .pdf 文件移到那里;删除所有其他内容;将 pdf 向后移动;删除中间目录。

快速、简单,您可以准确地看到自己在做什么。只需确保中间目录与您正在清理的目录位于同一设备上,以便移动是重命名,而不是复制!

  • +1 再次对于新手用户有意义的评论,这几乎肯定不会导致无意中删除文件。 (4认同)