我想在硬盘中查找包含特定单词的文本文件。
在 Ubuntu 12.4 之前,我曾经在仪表盘中启动一个应用程序,我认为它被称为“搜索文件...”,它的图标是一个放大镜。我再也找不到那个简单的应用程序了。
答案1
您可以grep
从终端使用以下命令:
grep -r word *
此命令将在当前目录(或子目录)下的所有文件中查找所有出现的“word”。
答案2
安装 gnome-search-tool。
sudo apt-get install gnome-search-tool
打开Search for files
选择Select More Options
并
答案3
这里概述了可用于在文件中搜索特定文本字符串的不同方法,其中专门添加了一些仅适用于文本文件而忽略二进制/应用程序文件的选项。
但是,需要注意的是,搜索单词可能会有点复杂,因为大多数行匹配工具都会尝试在行中的任何位置查找单词。如果我们要讨论的单词是字符串,可能出现在行首或行末,或单独出现在行中,或被空格和/或标点符号包围 - 这时我们就需要正则表达式,尤其是来自 Perl 的正则表达式。例如,在这里,我们可以使用-P
ingrep
来利用 Perl 正则表达式来包围它。
$ printf "A-well-a don't you know about the bird?\nWell, everybody knows that the bird is a word" | grep -noP '\bbird\b'
1:bird
2:bird
简单的 grep
$ grep -rIH 'word'
-r
从当前目录向下递归搜索-I
忽略二进制文件-H
输出匹配的文件名
仅适合搜索。
查找 + grep
$ find -type f -exec grep -IH 'word' {} \;
find
递归搜索部分-I
选项是忽略二进制文件-H
输出找到行的文件名与子 shell 中的其他命令结合的好方法,例如:
$ find -type f -exec sh -c 'grep -IHq "word" "$1" && echo "Found in $1"' sh {} \;
Perl
#!/usr/bin/env perl
use File::Find;
use strict;
use warnings;
sub find_word{
return unless -f;
if (open(my $fh, $File::Find::name)){
while(my $line = <$fh>){
if ($line =~ /\bword\b/){
printf "%s\n", $File::Find::name;
close($fh);
return;
}
}
}
}
# this assumes we're going down from current working directory
find({ wanted => \&find_word, no_chdir => 1 },".")
递归 bash 脚本中的 poor-mans 递归 grep
grep
这是“bash 方式”。并不理想,当您已经安装或拥有时,可能没有理由使用它perl
。
#!/usr/bin/env bash
shopt -s globstar
#set -x
grep_line(){
# note that this is simple pattern matching
# If we wanted to search for whole words, we could use
# word|word\ |\ word|\ word\ )
# although when we consider punctuation characters as well - it gets more
# complex
case "$1" in
*word*) printf "%s\n" "$2";;
esac
}
readlines(){
# line count variable can be used to output on which line match occured
#line_count=1
while IFS= read -r line;
do
grep_line "$line" "$filename"
#line_count=$(($line_count+1))
done < "$1"
}
is_text_file(){
# alternatively, mimetype command could be used
# with *\ text\/* as pattern in case statement
case "$(file -b --mime-type "$1")" in
text\/*) return 0;;
*) return 1;;
esac
}
main(){
for filename in ./**/*
do
if [ -f "$filename" ] && is_text_file "$filename"
then
readlines "$filename"
fi
done
}
main "$@"
答案4
是的,我知道你在寻找 GUI 应用程序,这是一篇旧帖子,但也许这对某些人有帮助。我找到了 ack-grep 实用程序。首先通过它安装,sudo apt-get install ack-grep
然后ack-grep what_you_looking_for
在要搜索的目录中运行命令。这会向你显示所有包含文本的文件,还会显示这些文件的预览。这对我来说非常重要。