删除除一个之外的所有 .log 文件

删除除一个之外的所有 .log 文件

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

答案1

您可以使用find命令,但使用时要小心 - 您最终可能会删除所有东西。

  • 重要的:首先,您必须运行不带选项的命令,-delete以确保输出是您想要删除的内容。请注意,它-name会查找确切的文件名。

    $ find -not -name mongodb.log -name "*.log"
    
  • 如果输出正确并且您确定该命令仅找到我们要删除的文件,那么您必须将该-delete选项添加到命令的末尾。

    $ find -not -name mongodb.log -name "*.log" -delete
    

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

例子

假设我们有这些文件:

$ ls
1.log  2.log  3.log  4.log  5.log  bar  foo  mongodb.log

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

$ find -not -iname mongodb.log -name "*.log"
  • 注意-iname!以保留的大小写版本mongodb.log

然后使用以下命令删除它们:

$ find -not -iname mongodb.log -name "*.log" -delete

再次检查,您将看到日志文件如预期的那样消失了,但mongodb.log仍然在那里。

$ ls
bar  foo  mongodb.log

答案2

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

shopt -s extglob

然后,您可以运行:

rm !(mongodb.log)

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

rm !(mongodb).log

例如:

$ ls
file1  file2  file3.log  file4.log  file5.log  mongodb.log
$ rm !(mongodb).log
$ ls
file1  file2  mongodb.log

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

shopt -s globstar

然后运行:

rm **/!(mongodb).log

例如:

$ 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

man bash

如果外接球使用 shopt 内置命令启用 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

 

全球星

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

相关内容