2

美好的一天,我找到了一种简单的方法来查找具有特定内容的文件,但我想创建一个 bash 脚本来更快地完成它,

脚本是:

#!/bin/bash
DIRECTORY=$(cd `dirname .` && pwd)
ARGUMENTS="'$@'"

echo find: $ARGUMENTS on $DIRECTORY
find $DIRECTORY -iname '*' | xargs grep $ARGUMENTS -sl

所以如果我写:

$ script.sh text

它应该在该目录中找到包含“文本”的文件

但是当我执行这个脚本时它总是失败,但是 echo 命令准确地显示了我所需要的,这个脚本有什么问题?

谢谢!

路易斯

参考资料:http ://www.liamdelahunty.com/tips/linux_find_string_files.php

4

3 回答 3

4

如果当前目录或搜索模式包含空格,则引用会在此脚本中中断。以下更简单,并解决了这两个问题:

find . -maxdepth 1 -type f -exec grep "$@" {} +

通过正确引用$@,您甚至可以将选项传递给 grep,例如-i.

./script -i "some text"
于 2013-03-02T18:45:53.313 回答
2

试试这个版本,有以下改动:

1.除非您打算运行多个 find/grep 来搜索多个模式,否则使用$1代替。$@

2.使用find $DIR -type f查找所有文件而不是find $DIR -iname '*'

-exec3.通过使用命令行选项避免管道find

4.不要将命令行参数单引号到您的脚本中,这是您拥有的版本的主要问题。您的 grep 字符串已转义单引号\'search_string\'

#!/bin/bash
DIRECTORY=$(cd `dirname .` && pwd)
ARGUMENTS="$1"

echo find: $ARGUMENTS on $DIRECTORY
find $DIRECTORY . -type f -exec grep -sl "$ARGUMENTS"  {} \;

提取所有命令行参数并将其传递给grep. 如果要搜索带空格的字符串,请在命令行中将字符串放在单引号内,如下所示:

/home/user/bin/test-find.sh 'i need to search this'
于 2013-03-02T18:53:06.217 回答
1

为什么不只运行以下命令?:

grep -R text .
于 2013-03-02T18:49:18.200 回答