正确的语法是什么:
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'
它的效率可能稍微低一些,但这通常不是一个问题,而且对于更复杂的东西,它通常更容易构建和修改。
标准警告适用于不要将其用于具有奇怪文件名(例如包含换行符)的文件。