Stackoverflow热门问题(十八)-怎么在所有Linux文件中搜索指定内容?

stackoverflow热门问题目录

如有翻译问题欢迎评论指出,谢谢。

怎么在所有Linux文件中搜索指定内容?

  • Nathan asked:
    • 我正在找一个能在linux系统所有文件中搜索包含指定文本的方法。强调一下,我想找的是文件内容,而不是文件名。
    • 在我找方法的时候,下面这条命令出现了两次:
    • find / -type f -exec grep -H 'text-to-find-here' {} \;
    • 但它并不合适。它似乎只展示了系统中的每个文件。
    • 这条命令接近正确方法了吗?如果没有的话,我该怎么办?这个搜索文件中字符串的方式对我现在的一些项目很有用。
  • Answers:
    • rakib_ – vote: 11228
      • 试试这个:
      • grep -rnw '/path/to/somewhere/' -e 'pattern'
      • -r 或 -R 表递归
      • -n 表行数
      • -w 表匹配完整单词
      • -l (小写L)表示显示被匹配文件的文件名
      • -e 表搜索时的模式
      • 除了这些,--exclude, --include, --exclude-dir也能方便搜索:
      • 只搜索.c 或 .h扩展名的文件:
      • grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
      • 搜索时排除.o扩展名的文件:
      • grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"
      • 排除所有dir1、dir2文件夹,以及所有 *.dst文件夹:
      • grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
      • 这个对我来说很有用,希望能满足你的需求。
      • 更多的选项见man grep
    • fedorqui ‘SO stop harming’ – vote: 1746
      • 可以使用grep -ilR
      • grep -Ril "text-to-find-here" /
      • i表示忽略忽略情况(在你的例子中可选)
      • R表示递归
      • L表示“显示文件名,而不是匹配结果”
      • /表示根目录
    • Stephan – vote: 377
      • 可以试试ack,类似用于源码的grep。用它可以扫描整个文件系统。
      • 就像这样:
      • ack 'text-to-find-here'
      • 在你的根目录中搜索。
      • 你也可以使用正则表达式来制定文件类型,等等。
      • 更新
      • 我发现了The Silver Searcher,它和ack类似,但速度是ack的三到五倍,用.gitignore文件设置忽略模式。

How do I find all files containing specific text on Linux?

  • Nathan asked:
    • I’m trying to find a way to scan my entire Linux system for all files containing a specific string of text. Just to clarify, I’m looking for text within the file, not in the file name.
      • 我正在找一个能在linux系统所有文件中搜索包含指定文本的方法。强调一下,我想找的是文件内容,而不是文件名。
    • When I was looking up how to do this, I came across this solution twice:
      • 在我找方法的时候,下面这条命令出现了两次:
    • find / -type f -exec grep -H 'text-to-find-here' {} \;
    • However, it doesn’t work. It seems to display every single file in the system.
      • 但它并不合适。它似乎只展示了系统中的每个文件。
    • Is this close to the proper way to do it? If not, how should I? This ability to find text strings in files would be extraordinarily useful for some programming projects I’m doing.
      • 这条命令接近正确方法了吗?如果没有的话,我该怎么办?这个搜索文件中字符串的方式对我现在的一些项目很有用。
  • Answers:
    • rakib_ – vote: 11228
      • Do the following:
        • 试试这个:
      • grep -rnw '/path/to/somewhere/' -e 'pattern'
      • -r or -R is recursive,
        • -r 或 -R 表递归
      • -n is line number, and
        • -n 表行数
      • -w stands for match the whole word.
        • -w 表匹配完整单词
      • -l (lower-case L) can be added to just give the file name of matching files.
        • -l (小写L)表示显示被匹配文件的文件名
      • -e is the pattern used during the search
        • -e 表搜索时的模式
      • Along with these, --exclude, --include, --exclude-dir flags could be used for efficient searching:
        • 除了这些,--exclude, --include, --exclude-dir也能方便搜索:
      • This will only search through those files which have .c or .h extensions:
        • 只搜索.c 或 .h扩展名的文件:
      • grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
      • This will exclude searching all the files ending with .o extension:
        • 搜索时排除.o扩展名的文件:
      • grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"
      • For directories it’s possible to exclude one or more directories using the --exclude-dir parameter. For example, this will exclude the dirs dir1/, dir2/ and all of them matching *.dst/:
        • 排除所有dir1、dir2文件夹,以及所有 *.dst文件夹:
      • grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
      • This works very well for me, to achieve almost the same purpose like yours.
        • 这个对我来说很有用,希望能满足你的需求。
      • For more options check man grep.
        • 更多的选项见man grep
    • fedorqui ‘SO stop harming’ – vote: 1746
      • You can use grep -ilR:
        • 可以使用grep -ilR
      • grep -Ril "text-to-find-here" /
      • i stands for ignore case (optional in your case).
        • i表示忽略忽略情况(在你的例子中可选)
      • R stands for recursive.
        • R表示递归
      • l stands for “show the file name, not the result itself”.
        • L表示“显示文件名,而不是匹配结果”
      • / stands for starting at the root of your machine.
        • /表示根目录
    • Stephan – vote: 377
      • You can use ack. It is like grep for source code. You can scan your entire file system with it.
        • 可以试试ack,类似用于源码的grep。用它可以扫描整个文件系统。
      • Just do:
        • 就像这样:
      • ack 'text-to-find-here'
      • In your root directory.
        • 在你的根目录中搜索。
      • You can also use regular expressions, specify the filetype, etc.
      • UPDATE
        • 更新
      • I just discovered The Silver Searcher, which is like ack but 3-5x faster than it and even ignores patterns from a .gitignore file.
        • 我发现了The Silver Searcher,它和ack类似,但速度是ack的三到五倍,用.gitignore文件设置忽略模式。

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注