Grep

如何對小於大小的文件進行 grep 並限制副檔名

  • February 4, 2021

我想遞歸地 grep 副檔名的子目錄中的所有文件,csv但只選擇那些小於 4M 的文件。這是正確的做法嗎?

find . -type f -size -4M | grep --include \*.csv 'pattern'

該命令選擇所有帶有 的文件.csv,基本上不限制小於 4M 的大小,儘管find單獨正確找到所有小於 4M 的文件。

首先,我將設置一些假數據:

$ for fileno in {1..4}; do for line in {1..100000}; do printf "%d,%d,%d,%d,%d,%d,%d,%d\n" $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM; done > ~/tmp/big-fake-${fileno}.csv; done
$ for fileno in {1..4}; do for line in {1..50000}; do printf "%d,%d,%d,%d,%d,%d,%d,%d\n" $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM $RANDOM; done > ~/tmp/small-fake-$fileno.csv; done

讓我們驗證它是否具有您感興趣的屬性:

$ du -b tmp/*.csv
4528666 tmp/big-fake-1.csv
4529227 tmp/big-fake-2.csv
4529173 tmp/big-fake-3.csv
4528782 tmp/big-fake-4.csv
2263714 tmp/small-fake-1.csv
2264028 tmp/small-fake-2.csv
2264398 tmp/small-fake-3.csv
2265134 tmp/small-fake-4.csv

現在讓我們在較小的文件中尋找某種模式:

$ find tmp/ -type f -iregex ".*\.csv" -size -4M -exec grep '1,1,1' {} +
tmp/small-fake-3.csv:15361,2526,13438,1083,3224,13221,1,19248

自然,grep這裡可以採用其他標誌,例如,-l如果您只對包含您想要的模式的文件名感興趣。

您可以將其{} +視為“插入發現的文件名列表find以代替括號”的模板。由於 Grep 樂於獲取文件名列表而不是一次一個,因此這優於-exec grep '1,1,1' {} \;,它會為每個單獨的文件啟動一個新的 Grep 實例,一次一個。

我認為這個-exec標誌是 GNU 主義,在其他類型的find. 我認為在其他平台上,它們採用了find -print0 | xargs -0一種模式。(我相信有人會對此發表評論。)

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