我想在一行中删除.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
*.csv
shopt -s extglob
setopt 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 中,使用N
glob 限定符,或者setopt nullglob
先运行。
rm -f *.(txt|csv)(N)
setopt nullglob extglob; rm -f *.@(txt|csv)