好日子,我发现了一个简单的方法来查找具有某些内容的文件,但我想创build一个bash脚本来做到这一点更快,
脚本是:
#!/bin/bash DIRECTORY=$(cd `dirname .` && pwd) ARGUMENTS="'$@'" echo find: $ARGUMENTS on $DIRECTORY find $DIRECTORY -iname '*' | xargs grep $ARGUMENTS -sl
所以如果我写:
$ script.sh text
它应该在该目录中find包含“文本”
但是当我执行这个脚本时总是失败,但是echo命令正好显示了我需要的东西,这个脚本有什么问题?
谢谢!
路易斯
参考文献: http : //www.liamdelahunty.com/tips/linux_find_string_files.php
如果当前目录或搜索模式中包含空格,则在此脚本中引用会有问题。 以下更简单,并解决了这两个问题:
find . -maxdepth 1 -type f -exec grep "$@" {} +
通过正确引用$@
,您甚至可以将选项传递给grep,例如-i
。
./script -i "some text"
尝试此版本,并进行以下更改:
1.使用$1
而不是$@
除非您打算运行多个find / grep来搜索多个模式。
2.使用find $DIR -type f
找到所有文件而不是find $DIR -iname '*'
3.使用find
的-exec
命令行选项避免管道。
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'
为什么不只是运行以下?
grep -R text .