我有两个目录,每个目录都有几千个文件,我正在尝试从文件中 grep 某些 IP。我的 grep 字符串是:
grep "IP" cdr/173/07/cdr_2018_07*
此 grep 字符串返回“grep:参数列表太长”。但是,当我执行以下操作时:
grep "IP" cdr/173/06/cdr_2018_06*
它返回我正在寻找的东西。
下面是每个目录的父目录的 ls -l。看起来差异约为 400KB,所以我不确定大小是否真的是这里的问题。我错过了什么吗?
jeblin@debian:~$ ls -l cdr/173
total 18500
REDACTED
drwxr-xr-x 2 jeblin jeblin 2781184 Jul 2 09:34 06
drwxr-xr-x 2 jeblin jeblin 2826240 Aug 1 07:33 07
如果有什么不同,我编写了一个 Python 脚本来自动执行此过程(搜索多个 IP),它适用于 06,但不适用于 07,这就是为什么我首先尝试进行手动 grep 搜索。
答案1
shell 无法调用太多文件,或者更确切地说,用于调用外部实用程序的命令行1grep
的长度有限制,当 shell 尝试使用扩展的 通配模式进行调用时,您就会碰到它。grep
cdr/173/07/cdr_2018_07*
您可以做的就是分别 grep 每个文件,
for pathname in cdr/173/07/cdr_2018_07*; do
grep "IP" "$pathname" /dev/null
done
其中额外的/dev/null
将强制grep
始终报告匹配的文件的文件名,或者您可以使用find
:
find cdr/173/07 -maxdepth 1 -type f -name 'cdr_2018_07*' \
-exec grep "IP" /dev/null {} +
这将更有效,因为grep
将使用尽可能多的匹配路径名进行调用尽可能分批。
也可能是,如果您首先cd
进入cdr/173/07
并执行
grep "IP" cdr_2018_07*
它可能可以工作,因为由于不包含目录位,生成的文件名列表会更短,但您可能非常接近 44.7k 文件的限制,应该认真考虑转向另一种方法来执行此操作,特别是如果您期望文件数量围绕该数字波动。
有关的:
1限制是命令行上的组合长度和环境(每个参数的长度和环境变量的名称和值的总和,也考虑到它们的指针),它是由execve()
shell 用于执行外部命令的系统调用施加的限制。诸如etc之类的内置命令echo
不存在这个问题。
答案2
问题是 shell 命令中允许的最大字节数限制。
*
扩展到目录中所有文件的总列表,因此重要的不是文件大小,而是文件名长度和文件数量。
您可以通过运行来获取计算机的字节限制$ getconf ARG_MAX
。请注意,此限制是由操作系统/内核而不是 shell 本身施加的。
避免这种情况的一种方法是使用 find:
$ find cdr/173/07/ -iname "cdr_2018_07*" -type f -exec grep "IP" {} \;
答案3
我根据以下几点回答问题:- 有两个目录:- 1)cdr/173/07 2)cdr/173/06
这两个目录中可能有很多文件我需要从中搜索
a)下面是第一个解决方案
grep -r "IP" cdr/173/07 -e "IP" cdr/173/06
b)但是如果你想搜索很多其他目录,你可以使用
grep -r "IP" cdr/173/*
c) 假设我们有 1000 个文件,并且我们只想搜索特定类型的文件。 grep -r “IP” cdr/173/07/cdr_2018_07* -e grep “IP” cdr/173/06/cdr_2018_06*