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

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

正确的语法是什么:

find . -type f -name \*.\(shtml\|css\)

这可行,但不够优雅:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

如何用更少的击键次数实现相同的功能?

答案1

您可以使用逻辑运算符-or或组合不同的搜索表达式-and,因此您的案例可以写成

find . -type f \( -name "*.shtml" -or -name "*.css" \)

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

编辑

由于-or优先级低于隐含的优先级,因此首先将名称部分放入括号-and中,正如克里斯所建议的那样。-type-name

答案2

以下是制作第一个版本的方法之一:

find -type f -regex ".*/.*\.\(shtml\|css\)"

答案3

您需要用括号括起来仅包含文件:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

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

答案4

我经常发现自己最终使用 egrep,或更长的管道,或 perl 来进行更复杂的过滤:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

它的效率可能稍微低一些,但这通常不是一个问题,而且对于更复杂的东西,它通常更容易构建和修改。

标准警告适用于不要将其用于具有奇怪文件名(例如包含换行符)的文件。

相关内容