Sud*_*doh 10 bash wildcards rm
我有以下文件列表:
main.acn 主程序.acr 主程序.alg 主辅助文件 主程序.glg 主程序.glo 主程序.gls 主要的 主程序.lof 主日志 主批次 主程序.nlo 主输出 main.pdf main.tex 主目录
我想 rm 除main.tex和main.pdfmain.*文件之外的所有文件。
我尝试过rm main.* !("main.tex","main.pdf"),但这没有用,并且main.* 无一例外地删除了所有内容。
有任何想法吗?
ilk*_*chu 21
!("main.tex","main.pdf")匹配任何不是 的内容main.tex,main.pdf,因此可能匹配目录中的所有文件。
需要注意的关键是!(...)已经表现得像*,因为它本身与不属于其中之一的任何内容相匹配。分隔符是|, 不是,。
所以,main.!(tex|pdf)应该有效。或者,!(main.tex|main.pdf)如果您想删除除这两个文件之外的所有文件,而不仅仅是名称以main..
看:
不太复杂的方法是保存要保留的文件,删除所有内容(其他),然后再次放回保存的文件。它也是一个符合 POSIX 标准的解决方案:
mkdir x # File or directory must not already exist
mv main.tex main.pdf x # Save the files you want to keep
rm ./* # Ignore the error about not deleting 'x'
mv x/* . # Restore everything you saved. Notice the dot!
rmdir x # Tidy up
Run Code Online (Sandbox Code Playgroud)
这里我选择了x一个尚不存在的文件或目录。你会得到一个错误,rm它无法删除x;那挺好的。不使用rm -rf!
请注意,通常rm ./*会跳过点文件。
在 Bash 中还有一个GLOBIGNORE变量,它可以从 glob 返回的列表中排除/删除名称。一个例子:
$ touch main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
$ echo *
main.pdf main.tex one.pdf one.tex three.wow two.pdf two.tex
$ GLOBIGNORE='main.tex:main.pdf'
$ echo *
one.pdf one.tex three.wow two.pdf two.tex
Run Code Online (Sandbox Code Playgroud)
GLOBIGNORE可以是描述要忽略的名称的表达式列表(以冒号分隔),如上面的示例所示。您的问题是关于排除一对简单的文件名,但您也可以使用 glob 表达式:
$ GLOBIGNORE='one.*:two.*'
$ echo *
main.pdf main.tex three.wow
Run Code Online (Sandbox Code Playgroud)
与 glob 匹配的名称列表(*在这些示例中)根据 中的表达式进行计算GLOBIGNORE。与任何表达式匹配的名称将从列表中删除。这是一个有用的功能。
在许多情况下,使用 也很有用export,例如export GLOBIGNORE='main.tex:main.pdf'。
| 归档时间: |
|
| 查看次数: |
2020 次 |
| 最近记录: |