我可以使用逻辑运算符来删除与一行中的一个和/或其他模式匹配的所有文件吗?

我可以使用逻辑运算符来删除与一行中的一个和/或其他模式匹配的所有文件吗?

我想在一行中删除.txt或文件。.csv

我的目录中有什么

tachomi$ ls
file1.csv  file1.sql  file1.txt  file2.csv  file2.sql  file2.txt

我只想要.sql文件,所以我想知道是否有办法使用逻辑运算符(例如AND或 ) OR在单行中执行命令

tachomi$ rm *.txt AND *.csv
tachomi$ rm *.txt OR *.csv

如何删除与两个给定模式匹配的所有文件

答案1

简单地:

rm *.txt *.csv

如果您的 shell 支持大括号扩展,您可以:

rm *.{txt,csv}

答案2

如果您想要匹配与任一模式匹配的文件,即匹配的文件*.txt和匹配的文件*.csv,或者换句话说,匹配*.txt或的文件,只需列出这两种模式即可*.csv。 (量词和逻辑运算符的嵌套很重要!)

rm *.txt *.csv

请注意,如果任一模式与任何文件都不匹配,它将保持不变,因此rm会抱怨找不到名为*.txt或 的文件*.csv。避免投诉的常见方法是使用rm -f,它会默默地忽略不存在的文件。

rm -f *.txt *.csv

没有运算符可以匹配同时匹配模式 1 和模式 2 的字符串。在这种情况下,无论如何都不存在匹配两者的*.txt字符串*.csv

在 ksh 中,模式@(*.txt|*.csv)或匹配与或*.@(txt|csv)匹配的字符串。如果您先运行,则可以在 bash 中使用此模式;如果你先运行,你可以在 zsh 中使用它,或者你可以使用 zsh 的原生语法。请注意,如果没有与复合模式匹配的文件,它将按原样传递给命令。在 ATT ksh 中(并且仅在 ATT ksh 中,不在 mksh、bash 或 zsh 中),如果没有文件与模式匹配,您可以使用 展开为空列表。您仍然需要使用,这样就不会抱怨缺少参数。*.txt*.csvshopt -s extglobsetopt ksh_glob*.(txt|csv)~(N)*.@(txt|csv)rm -f

rm -f ~(N)*.@(txt|csv)

在 bash 中,shopt -s nullglob首先运行以使所有模式扩展为空列表(如果它们不匹配)。

shopt -s nullglob extglob; rm -f *.@(txt|csv)

在 zsh 中,使用Nglob 限定符,或者setopt nullglob先运行。

rm -f *.(txt|csv)(N)
setopt nullglob extglob; rm -f *.@(txt|csv)

相关内容