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