2013-03-02 299 views
2

美好的一天, 我发现一个简单的方法来找到具有一定内容的文件,但我想创建一个bash脚本来quickier做到这一点,bash脚本查找文件

的脚本是:

#!/bin/bash 
DIRECTORY=$(cd `dirname .` && pwd) 
ARGUMENTS="'[email protected]'" 

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

有使用引号将在这个脚本打破,如果无论是当前目录或搜索模式包含一个空间问题。以下是更简单,并且修复了两个问题:

find . -maxdepth 1 -type f -exec grep "[email protected]" {} + 

有了正确引用的[email protected],你甚至可以把选项传递到grep,如-i

./script -i "some text" 
+0

谢谢!的确,一个优雅的解决方案 – xlarsx 2013-03-03 19:34:13

1

为什么不只是运行以下?:

grep -R text . 
2

试试这个版本,有以下变化:

1.使用$1而不是[email protected]除非你打算运行多个查找/ grep来搜索多个模式。

2.使用find $DIR -type f使用的find-exec命令行选项来发现,而不是find $DIR -iname '*'

3.Avoid管道的所有文件。

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'