私のディレクトリには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に分割して引数として渡します。*
.
r
OG00
l
Z
xargs
0
cp
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
。
次の内容を読むこともできます。
コードでよく見られるいくつかの間違いについて説明します。