使用`find`获得多个文件扩展名


16

我正在使用以下命令来计数JAVA文件中的文本行:

find . -name '*.java' | xargs wc -l

如何修改find命令参数以匹配多个文件扩展名?例如,我想对CPP,C和H文件使用以上操作。


这个问题实际上与find命令有关,因为这是您要搜索匹配文件的地方。
iglvzx 2012年

1
另外,请使用find -print0 | xargs -0结构,甚至更好或更简单的方法:find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +。这将避免任何文件名问题(空格,换行等),并且(非常)是自定义的。
丹尼尔·安德森

Answers:


16

使用该-o选项进行“或”操作。例如,这将列出.cpp.c并且.h文件:

find . -name \*.cpp -o -name \*.c -o -name \*.h

啊。该*如果格式化为代码进行转义不再需要。完全忽略了这一点。:)
iglvzx 2012年

是的,由两个人进行了三个编辑,但我们知道了。
JOTN 2012年

2
在OSX上,这对我不起作用(仅与最后一个-name * .ext匹配)-我必须使用括号,如下面的@ Smokeuns所建议。
吉列德(Gilead)

2

您将需要使用-o选项。例如,下面的语句在一个文件夹中找到所有png,jpg和gif文件。

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

我使用-iname选项,以便匹配不区分大小写。


1
iname并非在所有版本的find中都可用。
JOTN 2012年


1

尽管所有答案或多或少都是相同的,但我发现它们之间不能使用多个名称和布尔运算符来读取。

我认为这可能是更优雅的解决方案:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

让我们分手吧

  • find . 以递归方式查找当前路径中的所有文件(如果需要,可以更改为其他路径)
  • -type f仅将搜索范围缩小到文件(速度提升幅度不大,但仍然...)
  • | grep -E我用它来获得Mac OS X中使用FreeBSD grep的grep识别|)运算符,而GNU grep则不需要(在文件中签入)。man
  • "\.java$|\.cpp$|\.c$"正则表达式,其中包括它的文件名结尾.java.cpp.c(ADD那些你需要)

然后,您可以通过管道传输结果列表以进行进一步处理,例如

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

本示例删除CRLF了OS X / Linux的DOS / Windows 行结尾LF(这也是OS X sed语法,请检查您的版本细节)。


我想使用25个不同的扩展名匹配参数来查找所有视频文件类型。这是唯一对我有用的方法。(Ubuntu 14.04 LTS)
极客长老

0

采用

find path/to/dir -name "*.ext1" -o -name "*.ext2"

说明

  1. 第一个参数是您要搜索的目录。
  2. 默认情况下find会递归。
  3. -o代表-or。因此,以上表示搜索此通配符或此通配符。如果只有一种模式,则不需要-o
  4. 通配符模式周围的引号是必需的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.