我正在努力克服对文件结构的限制。我想在已知位置grep一系列文件。如果我从命令行执行标准grep
(grep -i searchpattern known_dir/s*.sql)
我收到以下错误:
ksh: /usr/bin/grep: 0403-027 The parameter list is too long.
所以我有一个小循环看起来像:
searchfor=$1
for i in /$ENV_VAR_DIR/s*.sql
do
grep -i $searchfor $i
done
当我执行此操作时,我遇到了几个问题:
-l
显然只给了我想要修剪路径的路径/文件名,我只是从我的主目录执行。答案 0 :(得分:3)
我会推荐以下内容:
$ find known_dir -name 's*.sql' -print0 | xargs -0 grep -i searchpattern
使用xargs
,您可以使用grep
选项更改传递到-n
的最大文件数。
-print0
和-0
选项可以防御文件名中的空格。
您甚至可以使用grep
选项在多个核心上并行计算多个-P
命令。
答案 1 :(得分:2)
作为一个hack,您还可以为grep命令指定/ dev / null以使-l列出文件,但是由于它使用shell循环并且每个文件启动一个grep进程,因此您的方法会很慢。如上所述,find
和xargs
是您的朋友。
也许您可以使用findrepo脚本,它似乎可以根据您的需要进行操作。
答案 2 :(得分:1)
ls | read fname; do
grep searchpattern $fname /dev/null
done
这对你有两件事。
使用此shell设计模式的另一个传统方法是使用find
提供循环。
find . -name "*.sql" | read fname; do
grep searchpattern $fname /dev/null
done
您可能还希望将searchpattern
设为$1
。
答案 3 :(得分:1)
find ./known_dir/ -name“s * .sql”| xargs grep -i searchpattern
答案 4 :(得分:0)
grep -H
将强制将文件名添加到每个输出行,就像您执行原始单个命令时一样。
从-H
或-l
获取文件名的最简单方法是在运行命令时将目录作为当前工作目录:
searchfor=$1
cd /$ENV_VAR_DIR
for i in s*.sql
do
grep -Hi $searchfor $i
done
答案 5 :(得分:0)
答案 6 :(得分:0)
easy_install grin
grin -I "*.sql" searchpattern
仅显示文件名
grin -I "*.sql" -l searchpattern