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)
要删除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 选项,则可以识别多个扩展模式匹配运算符。在下面的描述中,模式列表是由|分隔的一个或多个模式的列表。. 可以使用以下一种或多种方式形成复合图案?降低子模式:
Run Code Online (Sandbox Code Playgroud)?(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
环球之星
如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟 /,则仅目录和子目录匹配。