ディレクトリ構造内の特定の単語を含むすべてのファイルを検索しようとしても機能しません。
- たとえば、 path で実行すると、
/Institute/IITDhanbad/
次のコマンドが実行されます。
結果はgrep -rn "Programmer" *
BTECH/CompScience.txt:22: Sudip is a Programmer
- ただし、パスで実行すると
/Institute/IITDhanbad/MTECH
同じコマンドが提供されます。CSP/Boys/Good/Electronics.txt:13: Sourav is a Programmer
問題は、フォルダgrep
から呼び出しを実行したときに予想される結果/Institute/IITDhanbad/
は次のとおりです。両方結果は
BTECH/CompScience.txt:22: Sudip is a Programmer
MTECH/CSP/Boys/Good/Electronics.txt:13: Sourav is a Programmer
何が間違っていて、どのように解決しますか?
追加情報:
ファイル形式とアクセス権は次のとおりです。
文書 モデル MTECH
drwxrwsr-x
BTECH
drwxrwsr-x
CSP
lrwxrwxrwx
ls -ld
/Institute/IITDhanbad/
パスから:drwxrwsr-x 4 suresh faculty 4096 Sep 16 00:53
ls -ld
/Institute/IITDhanbad/MTECH
パスから:drwxrwsr-x 4 suresh faculty 4096 Sep 16 00:53
ls -ld
/Institute/IITDhanbad/MTECH/CSP
パスから:dr-xr-sr-t 4 ganesh faculty 4096 Sep 12 20:58 .
答え1
CSP
シンボリックリンクです(参照l
)lrwxrwxrwx
。明らかgrep
に、引数として与えられたもの以外のシンボリックリンクに従わないようです。-r
これを行うとき:
grep -rn "Programmer" *
CSP
(上にあります/Institute/IITDhanbad/MTECH/
か?)の親ディレクトリでは、CSP
シェルが展開された後に引数として表示されます*
。ただし、「親」ディレクトリ(in)/Institute/IITDhanbad/
でこれを行う場合、これはパラメータでCSP
はなく、grep
再帰スキャン中に見つかったシンボリックリンクです。
これがGNUがどのようにgrep
機能するかです。あなたはgrep
GNUですかgrep
?その場合は、マニュアルを参照してください-R
。-R
いい-r
けどするシンボリックリンクに従ってください。
grep -rn "Programmer" .
親ディレクトリで操作を実行した場合、CSP
これはCSP
パラメータとして表示されません。の使用は*
観察された結果にとって非常に重要です。
答え2
回答
GNU grep マニュアルこのオプションは、-r
ディレクトリ階層の親シンボリックリンクではなく、直接シンボリックリンク(コマンドラインに提供されているリンク)のみに従うことを宣言します。
-アル字型
--再帰
各ディレクトリオペランドに対して、ディレクトリ内のすべてのファイルを繰り返し読み込み、処理します。コマンドラインでシンボリックリンクに従い、再帰的に表示されるシンボリックリンクはスキップされます。ファイルオペランドが指定されていない場合、grepは作業ディレクトリを検索します。これは "--directories=recurse" オプションと同じです。
したがって、指定されたテキストを検索すると、指定されたMTECHディレクトリ内の直接シンボリックリンクであるCSPディレクトリは通過しません。
注:質問を明確にする前に、以前の答えは次のとおりです。
問題の考えられる原因
サブディレクトリMTECHは実行許可ビットを設定できません。例えば:
$ mkdir -p one/two
$ cd one
$ cat <<EOT > test.txt
abc def
EOT
$ cp test.txt two
$ grep -rn def *
test.txt:1:abc def
two/test.txt:1:abc def
$ chmod -x two
$ grep -rn def *
test.txt:1:abc def
grep: two/test.txt: Permission denied
もちろん、これを行うとstderrにエラーメッセージが表示されます。しかし、もしgrep をエイリアスに設定到着/usr/bin/grep -s
:
$ alias grep='/usr/bin/grep -s'
$ grep -rn def *
test.txt:1:abc def
これはパズルの最後の部分かもしれません。
解決策
unalias grep
grepを実行する前に使用する/usr/bin/grep
かgrep
。
答え3
単にcmdを実行してアプローチを簡素化できます。
target_dir="/path/to/directory/of/interest"
[ -d "$target_dir" ] && grep -rn -e "Programmer" "$target_dir"
または、試したのと似ていますが、ファイルオペランドのテストをディレクトリとして含めます。
target_dir="/path/to/directory/of/interest"
[ -d "$target_dir" ] && cd "$target_dir" && grep -rn -e "Programmer"
-r
ファイルオペランドを指定せずにrecurse()を使用することは、以下で繰り返すのと同じ事実を持ちます$PWD
。
これがあなたが求めているものですか?