查找按多个扩展名过滤的文件

Dav*_*vis 58 bash find file-extension filenames

什么是正确的语法:

find . -type f -name \*.\(shtml\|css\)
Run Code Online (Sandbox Code Playgroud)

这有效,但不优雅:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt
Run Code Online (Sandbox Code Playgroud)

如何做同样的事情,但击键次数更少?

Ben*_*ier 81

您可以将不同的搜索表达式与逻辑运算符-oror 结合使用-and,因此您的案例可以写为

find . -type f \( -name "*.shtml" -or -name "*.css" \)
Run Code Online (Sandbox Code Playgroud)

这也表明您在使用引号时不需要转义特殊的 shell 字符。

编辑

正如 Chris 所建议-or的那样-and,Since 的优先级低于隐含在-type和第一个-name放入括号中的名称部分。


Den*_*son 17

这是制作第一个版本的一种方法:

find -type f -regex ".*/.*\.\(shtml\|css\)"
Run Code Online (Sandbox Code Playgroud)


Ted*_*ddy 15

您需要括号以仅包含文件:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print
Run Code Online (Sandbox Code Playgroud)

奖励:这是符合 POSIX 的语法。