我的目录中有 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 以作为参数传递给。*
.
r
OG00
l
Z
xargs
0
cp
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 -P
或grep -X
受支持的地方。
您可能还想阅读:
关于代码中的一些常见错误。