我很确定我之前已经看过这个,但我无法记住确切的语法。
假设您有几个文件扩展名不同的文件:
foo.txt
bar.rtf
index.html
而不是对所有这些(cat *
)执行某些操作,您只想在3个文件扩展名中的2个上运行命令。
你不能做这样的事吗?
cat ${*.txt|*.rtf}
我确定有一些find
技巧首先识别文件并将它们传递给命令,但我认为bash支持我所谈论的内容而不必做这一点。
答案 0 :(得分:4)
您想要的语法是cat *.{txt,rft}
。使用逗号代替管道。
$ echo foo > foo.txt
$ echo bar > bar.rft
$ echo "bar txt" > bar.txt
$ echo "test" > index.html
$ cat *.{txt,rft}
bar txt
foo
bar
$ ls *.{txt,rft}
bar.rft bar.txt foo.txt
但是Anthony Geoghegan said in their answer可以使用更简单的方法。
答案 1 :(得分:2)
Shell globbing比正则表达式更基本。如果您想cat
所有带有.txt
或.rtf
后缀的文件,您只需使用:
cat *.txt *.rtf
将扩展glob模式以列出与模式匹配的所有文件名。在您的情况下,上面的命令将调用带有cat
和foo.txt
的{{1}}命令作为其参数。
答案 2 :(得分:0)
这是一种使用命令替换的简单方法。
cat $(find . -type f \( -name "*.txt" -o -name "*.rtf" \))
但是Anthony Geoghegan's answer要简单得多。我也从中学到了。