Bash
在文本文件中搜尋星號 (*) 並複製到新目錄?
我在一個目錄中有 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 -P
或grep -X
支持的地方。您可能還想閱讀:
關於程式碼中的一些常見錯誤。