在文本文件中搜索星号 (*) 并复制到新目录?

在文本文件中搜索星号 (*) 并复制到新目录?

我的目录中有 5000 个文本文件,每个文本文件名都以前缀开头奥格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 分隔的文件;获取该输出,并将其拆分为s 以作为参数传递给。*.rOG00lZxargs0cp

POSIX 等效项是:

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

尽管这意味着grep每个文件运行一个,所以效率会大大降低。

*要将 a与匹配grep,选项有:

  • grep -F '*'如果您只需要搜索固定字符串,则固定字符串匹配最简单,也是您想要使用的匹配。
  • grep '*'在基本正则表达式中,*模式的开头匹配文字*grep 'a*'会匹配任何 0 个或多个 s 的序列a,并且您需要grep 'a\*'orgrep 'a[*]'来匹配文字a*
  • grep -E '\*'/ grep -E '[*]'。对于扩展的正则表达式,*模式开头的 a 是一个错误,*需要转义。同样适用于grep -Pgrep -X受支持的地方。

您可能还想阅读:

关于代码中的一些常见错误。

相关内容