Bash

在文本文件中搜尋星號 (*) 並複製到新目錄?

  • August 2, 2022

我在一個目錄中有 5000 個文本文件,每個文本文件名都以前綴OG00 * 開頭(例如 - 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

這樣的事情呢?

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

使用 GNU 工具:

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

grep在名稱以開頭的文件中F遞歸搜尋*目前目錄(獲取該輸出,並將其拆分為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 -Pgrep -X支持的地方。

您可能還想閱讀:

關於程式碼中的一些常見錯誤。

引用自:https://unix.stackexchange.com/questions/712071