"grep -rn" は、2 つの予測結果のうち 1 つだけを生成します。

"grep -rn" は、2 つの予測結果のうち 1 つだけを生成します。

ディレクトリ構造内の特定の単語を含むすべてのファイルを検索しようとしても機能しません。

  • たとえば、 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シンボリックリンクです(参照llrwxrwxrwx。明らかgrepに、引数として与えられたもの以外のシンボリックリンクに従わないようです。-rこれを行うとき:

grep -rn "Programmer" *

CSP(上にあります/Institute/IITDhanbad/MTECH/か?)の親ディレクトリでは、CSPシェルが展開された後に引数として表示されます*。ただし、「親」ディレクトリ(in)/Institute/IITDhanbad/でこれを行う場合、これはパラメータでCSPはなく、grep再帰スキャン中に見つかったシンボリックリンクです。

これがGNUがどのようにgrep機能するかです。あなたはgrepGNUですか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 grepgrepを実行する前に使用する/usr/bin/grepgrep

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

これがあなたが求めているものですか?

関連情報