删除所有 .log 文件,除了一个

Zoh*_*sit 7 command-line extension delete

我想删除所有带有.log扩展名的文件,除了一个。是否可以删除.log除 mongodb 日志文件之外的所有文件夹中的所有文件?

Rav*_*ina 10

您可以使用find命令,但在使用它时要小心 - 您最终可能会删除您拥有的所有内容。

  • 重要提示:首先,您必须在没有-delete选项的情况下运行该命令,以确保输出是您要删除的内容。请注意,-name查找确切的文件名。

    $ find -not -name mongodb.log -name "*.log"
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果输出正确并且您确定该命令仅定位我们要删除的文件,则必须将该-delete选项添加到该命令的 END 中。

    $ find -not -name mongodb.log -name "*.log" -delete
    
    Run Code Online (Sandbox Code Playgroud)

    选项的顺序find很重要,在这种情况下,如果-delete选项放置在命令末尾以外的任何位置 - 它将删除所有内容。

例子

想象一下我们有这些文件:

$ ls
1.log  2.log  3.log  4.log  5.log  bar  foo  mongodb.log
Run Code Online (Sandbox Code Playgroud)

让我们列出所有*.log不包括mongodb.log. 检查输出并确保它不包含除log文件之外的任何内容。

$ find -not -iname mongodb.log -name "*.log"
Run Code Online (Sandbox Code Playgroud)
  • 注意-iname!保留大写和小写版本的mongodb.log.

然后使用以下方法删除它们:

$ find -not -iname mongodb.log -name "*.log" -delete
Run Code Online (Sandbox Code Playgroud)

再次检查,您将看到日志文件已按预期消失,但mongodb.log仍保留在那里。

$ ls
bar  foo  mongodb.log
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

要删除mongodb.log除名为 的文件之外的所有文件,您可以使用扩展通配符。首先,启用该选项:

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

然后,您可以运行:

rm !(mongodb.log)
Run Code Online (Sandbox Code Playgroud)

或者,要仅删除带有.log扩展名的文件,但不删除mongodb.log,您可以执行以下操作:

rm !(mongodb).log
Run Code Online (Sandbox Code Playgroud)

例如:

$ ls
file1  file2  file3.log  file4.log  file5.log  mongodb.log
$ rm !(mongodb).log
$ ls
file1  file2  mongodb.log
Run Code Online (Sandbox Code Playgroud)

如果您需要递归,以匹配子目录中的文件,您可以使用以下globstar选项:

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

然后运行:

rm **/!(mongodb).log
Run Code Online (Sandbox Code Playgroud)

例如:

$ tree
.
??? bar
?   ??? baz
?       ??? bad
?           ??? file1
?           ??? file2
?           ??? file3.log
?           ??? file4.log
?           ??? file5.log
?           ??? mongodb.log
??? file1
??? file2
??? file3.log
??? file4.log
??? file5.log
??? mongodb.log

$ rm **/!(mongodb).log

$ tree
.
??? bar
?   ??? baz
?       ??? bad
?           ??? file1
?           ??? file2
?           ??? mongodb.log
??? file1
??? file2
??? mongodb.log

3 directories, 6 files
Run Code Online (Sandbox Code Playgroud)

来自man bash

如果使用 shopt 内置程序启用了extglob shell 选项,则可以识别多个扩展模式匹配运算符。在下面的描述中,模式列表是由|分隔的一个或多个模式的列表。. 可以使用以下一种或多种方式形成复合图案?降低子模式:

      ?(pattern-list)
             Matches zero or one occurrence of the given patterns
      *(pattern-list)
             Matches zero or more occurrences of the given patterns
      +(pattern-list)
             Matches one or more occurrences of the given patterns
      @(pattern-list)
             Matches one of the given patterns
      !(pattern-list)
             Matches anything except one of the given patterns
Run Code Online (Sandbox Code Playgroud)

 

环球之星

如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟 /,则仅目录和子目录匹配。