テキストファイルでアスタリスク(*)を検索して新しいディレクトリにコピーしますか?

テキストファイルでアスタリスク(*)を検索して新しいディレクトリにコピーしますか?

私のディレクトリには5000のテキストファイルがあります。各テキストファイル名はプレフィックスで始まります。8月00日*(例 - OG0017774.log)

ファイル内にアスタリスク(*)を含む.logファイルを新しいディレクトリにコピーする必要があります。

文書内容 -

cat OG0017774.log

M0~b904dbe442e0eb658d229076cacb9ef6 M1~9edeedcb1f4f315c4689bacd8075222f 0.000035**
M0~b904dbe442e0eb658d229076cacb9ef6 M2~aeba83b564ee32e0ef1a8321c8d930f4 0.000671**
M0~b904dbe442e0eb658d229076cacb9ef6 M3~006a376da2fba16185ce424bf4cba983 0.000055**
M0~b904dbe442e0eb658d229076cacb9ef6 M4~e564dbfbbbe8d1f7d9d8c8e4da202943 0.000015**
M0~b904dbe442e0eb658d229076cacb9ef6 M5~2abe603e8fee2fcb08b7fb818957e0aa 0.000006**

ご提案いただきありがとうございます。

このコードを試してみると、現在のディレクトリ内のすべてのファイルが新しいディレクトリにコピーされます。

*を含むすべてのテキストファイルをコピーしたいです。

#!/bin/bash
KEYWORD_PATTERN='*'
find . -type f |
while read FNAME
do
    if grep -Ew -q "$KEYWORD_PATTERN" $FNAME
    then
        KEYWORD=$(grep -Ew -o "$KEYWORD_PATTERN" $FNAME)
        cp -r $FNAME keywords/$KEYWORD
    fi

done

答え1

このようなことがある場合はどうすればよいですか?

for i in OG00*; do 
    if grep -q -F '*' "$i"; then 
        mv "$i" ../keywords/
    fi
done

答え2

GNUツールの使用:

grep -rFlZ --include='OG00*' '*' . |
  xargs -r0 cp -t ../keywords

grep現在のディレクトリ()でF名前がistで始まるファイルのうち、eroで区切られた一致するファイルが1つ以上ある固定文字列を繰り返し検索し、その出力をsに分割して引数として渡します。*.rOG00lZxargs0cp

POSIXに対応する内容は次のとおりです。

find . -name 'OG00*' -type f -exec grep -qF '*' {} ';' \
   -exec sh -c 'exec cp "$@" ../keywords' sh {} +

これはgrepファイルごとに1つずつ実行するという意味なので、効率が大幅に低下します。

*a を一致させるためのgrepオプションは次のとおりです。

  • grep -F '*'固定文字列の一致は最も簡単で、固定文字列のみを検索する必要がある場合に使用したいものです。
  • grep '*'基本正規表現では、*パターンの先頭はリテラルと一致します*grep 'a*'0個以上のsシーケンスに一致し、リテラルに一致するorがa必要です。grep 'a\*'grep 'a[*]'a*
  • grep -E '\*'/ grep -E '[*]'。拡張正規表現の場合、*パターンの先頭のaはエラーであるため、*エスケープする必要があります。どこでも同じように適用またはサポートさgrep -Pれますgrep -X

次の内容を読むこともできます。

コードでよく見られるいくつかの間違いについて説明します。

関連情報