如何对小于大小和扩展名限制的文件进行 grep

如何对小于大小和扩展名限制的文件进行 grep

我想递归地 grep 子目录中带有扩展名的所有文件csv,但只选择那些大小小于 4M 的文件。这是正确的做法吗?

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

该命令选择所有带 的文件.csv,基本上不限制大小小于 4M,尽管find单独正确找到所有小于 4M 的文件。

答案1

首先我将设置一些假数据:

$ 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模式。 (我确信有人会发表评论对此进行详细说明。)

相关内容