2

良い一日、特定のコンテンツを含むファイルを見つける簡単な方法を見つけましたが、それをより迅速に行うための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

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 に答える