Grep
如何對小於大小的文件進行 grep 並限制副檔名
我想遞歸地 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
一種模式。(我相信有人會對此發表評論。)