2013-03-02 283 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'