特殊ファイル名を使用した Grep 式

特殊ファイル名を使用した Grep 式

ディレクトリ内のいくつかの一般的なファイルを参照し、コンテンツに一意の名前を持つこれらのファイルを見つける必要があります。

以下のスクリプトスニペットでは、パスを繰り返し、grepを使用してその内容内のファイル名を見つけます。確かに正しいのは、 $something:q - ファイルを探す必要があるパス配列です。次の変数は、現在のファイルの名前のみを含む名前です。例:/home/computer/text.txt(パス)とtext.txt(名前)

最大の問題は、コンテンツ内でファイル名を見つけることです。私が見ているファイルとディレクトリの名前が奇妙なので、これに正しいgrepを書くのは非常に難しいです。そのうちのいくつかは次のとおりです。

/home/OS/pocitacove/testovaci_adresar/z/test4.pre_expertov/!_1
/home/OS/pocitacove/testovaci_adresar/z/test4.pre_expertov/dam/$user/:e/'/-r
/home/OS/pocitacove/testovaci_adresar/z/test3/skusime/ taketo/   taketo
/home/OS/pocitacove/testovaci_adresar/z/test4.pre_expertov/.-bla/.-bla/.a=b
/home/OS/pocitacove/testovaci_adresar/z/test4.pre_expertov/.-bla/.-bla/@
/home/OS/pocitacove/testovaci_adresar/z/test4.pre_expertov/.-bla/.-bla/:
/home/OS/pocitacove/testovaci_adresar/z/test4.pre_expertov/.-bla/.-bla/'ano'

foreach paths ($something:q)
    set name = "$paths:t"
    @ number = (`grep -Ec "$name" "$paths"`)

    if ($number != 0) then
        echo -n "$paths "
        echo $number
    endif

    @ number = 0
end

答え1

私が正しく理解した場合、問題はファイル名が正規表現のメタ文字として解釈されることです。この場合(POSIXで指定)-Fに切り替える必要があります。パターンが正規表現ではなく固定文字列として解釈されるように指示grepします。grep

@ number = (`grep -Fc -- "$name" "$paths"`)

また、拡張正規表現を有効にするスイッチが不要になる--ことgrepに注意してください。--E

関連情報