美好的一天, 我找到了一种查找具有特定内容的文件的简单方法,但我想创建一个bash脚本来更快地完成,
脚本是:
#!/bin/bash
DIRECTORY=$(cd `dirname .` && pwd)
ARGUMENTS="'$@'"
echo find: $ARGUMENTS on $DIRECTORY
find $DIRECTORY -iname '*' | xargs grep $ARGUMENTS -sl
所以,如果我写:
$ script.sh text
它应该在该目录中找到包含“text”
的文件但是当我执行这个脚本时它总是失败,但是echo命令显示我需要什么,这个脚本有什么问题?
谢谢!
路易斯
参考文献:http://www.liamdelahunty.com/tips/linux_find_string_files.php
答案 0 :(得分:4)
如果当前目录或搜索模式包含空格,则引用存在问题,将在此脚本中断。以下更简单,并修复了这两个问题:
find . -maxdepth 1 -type f -exec grep "$@" {} +
正确引用$@
后,您甚至可以将选项传递给grep,例如-i
。
./script -i "some text"
答案 1 :(得分:2)
尝试此版本,并进行以下更改:
1.使用$1
代替$@
,除非您打算运行多个find / grep来搜索多个模式。
2.使用find $DIR -type f
查找所有文件而不是find $DIR -iname '*'
3.使用-exec
的{{1}}命令行选项避免管道。
4.不要单独引用脚本的命令行参数,这是您拥有的版本的主要问题。您的grep字符串已转义为单引号find
\'search_string\'
没有必要提取所有命令行参数并将其传递给#!/bin/bash
DIRECTORY=$(cd `dirname .` && pwd)
ARGUMENTS="$1"
echo find: $ARGUMENTS on $DIRECTORY
find $DIRECTORY . -type f -exec grep -sl "$ARGUMENTS" {} \;
。如果要搜索带空格的字符串,请在命令行的单引号内传递字符串,如下所示:
grep
答案 2 :(得分:1)
为什么不运行以下内容?:
grep -R text .