我有以下文件列表:
主要.acn 主文件 主算法 主辅助 主文件 主文件 主文件 main.ist 主文件 主日志 主要批次 主文件 主输出 main.pdf main.tex 主目录
我想 rmmain.*
除main.tex和main.pdf文件之外的所有文件。
我试过rm main.* !("main.tex","main.pdf")
了,但没有奏效,main.*
无一例外地删除了所有。
有任何想法吗?
我有以下文件列表:
主要.acn 主文件 主算法 主辅助 主文件 主文件 主文件 main.ist 主文件 主日志 主要批次 主文件 主输出 main.pdf main.tex 主目录
我想 rmmain.*
除main.tex和main.pdf文件之外的所有文件。
我试过rm main.* !("main.tex","main.pdf")
了,但没有奏效,main.*
无一例外地删除了所有。
有任何想法吗?
!("main.tex","main.pdf")
匹配任何不是的main.tex,main.pdf
,所以可能是目录中的所有文件。需要注意的关键是,它的
!(...)
行为类似于*
,因为它本身匹配任何不是内部事物之一的东西。而分隔符是|
,不是,
。所以,
main.!(tex|pdf)
应该工作。或者!(main.tex|main.pdf)
,如果您想删除除这两个文件之外的所有文件,而不仅仅是名称以 . 开头的文件main.
。看:
不太复杂的方法是保存要保留的文件,删除所有内容(其他),然后将保存的文件重新放回去。它也是一个符合 POSIX 的解决方案:
在这里,我选择
x
了一个尚不存在的文件或目录。您将收到rm
无法删除的错误x
;那挺好的。不要使用rm -rf
!请注意,通常
rm ./*
会跳过点文件。在 Bash 中还有一个
GLOBIGNORE
变量,它可以从 glob 返回的列表中排除/删除名称。一个例子:GLOBIGNORE
可以是描述要忽略的名称的表达式列表(以冒号分隔),如上例所示。您的问题是关于排除一对简单的文件名,但您也可以使用 glob 表达式:与 glob 匹配的名称列表(
*
在这些示例中)根据GLOBIGNORE
. 匹配任何表达式的名称将从列表中删除。这是一个有用的功能。在许多情况下,使用 也很有用
export
,例如export GLOBIGNORE='main.tex:main.pdf'
.每当我遇到这样的情况时,我都会使用管道:
ls -1 主要。* | egrep -v '\.pdf|\.tex' | xargs rm