ワイルドカードで囲まれた文字列に一致するファイルのみを見つけるためにgrepする方法

ワイルドカードで囲まれた文字列に一致するファイルのみを見つけるためにgrepする方法

指定された数字と文字列のみを含むファイルを見つける必要があります。伊藤が発見した856ワイルドカード文字で囲みます*856*

たとえば、私はこれを持っていますファイルA.txt数千の数字があります。

45423542354235423542
5423543542353254235
345435245243
435435345
452345345
4523543455454

このスクリプトがあります。

#!/bin/sh

findFile() {
    while read -r LINE
    do
         printf "$LINE\n"
         grep -il "$LINE" *856*
         printf "\n"
    done < /path/to/fileA.txt > /path/to/result.txt
}

findFile

編集する:ファイル名にfileA.txt

希望の出力:

45423542354235423542
found_file_856_COMPANY_FFW3443E.dat

5423543542353254235
found_file_856_COMPANY_43R43F.dat

345435245243
found_file_856_COMPANY_77Y85HHH.dat

435435345
found_file_856_COMPANY_64Y76H6.dat

452345345
found_file_856_COMPANY_9630GGTFVF.dat

4523543455454
found_file_856_COMPANY_2R98JD925.dat

答え1

ファイル名に改行がないと仮定すると...

「-files」リストを作成し、856それを使用して目的grepのファイルをフィルタリングします。

find . -name '*856*' > filelist
grep -Ff fileA.txt filelist >result.txt

このgrepコマンドは文字列をパターンとして使用し、その文字列と一致する名前を抽出しますfileA.txtfilelistこのフラグは、文字列が(正規表現ではなく)固定文字列として解釈されることを-F保証します。fileA.txt

fileA.txtたとえば、プレフィックスを追加し、_サフィックス.datを追加してパターンをより具体的に指定する必要があります。

sed -e 's/^/_/' -e 's/$/.dat' fileA.txt >fileB.txt

その後、代わりにfileB.txtwithを使用できます。grepfileA.txt

答え2

あなたの質問で何を求めているのか(例:何を達成しようとしていますか?)、またはどの種類のシェルを使用しているのかは不明です。残念ながら私は代理人を持っていません。コメント。

シェルを使用していると仮定すると、bash現在のフォルダに文字列856を含むすべてのファイルを返すワイルドカードパターンを見つける場合は、これが*856*正しい方法です。

sausages明確にするために、名前にその文字列を含むすべてのファイルを検索するには、snacks_for_later次のようにします。

    $ grep sausages *snacks_for_later*

ソーセージを探してください。


正しいファイルから検索していることを確認するには、lsを使用してワイルドカードパターンをテストできます。

    $ ls *856*

ファイルがあるフォルダーでコマンドを実行しない場合は、/path/to/allfiles/*856*grepおよびlsパターンを使用する必要があります。グローバルパターン(例: "*")はディレクトリを巡回しません。

関連情報