我想删除.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
全球星
如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟 /,则仅匹配目录和子目录。