Argument list too long

Warren Block wblock at wonkity.com
Fri Mar 8 20:05:50 UTC 2013


On Fri, 8 Mar 2013, Brooks Davis wrote:

> On Thu, Mar 07, 2013 at 05:15:46PM +0100, Lars Engels wrote:
>> On Thu, Mar 07, 2013 at 05:50:36PM +0200, Vladislav Prodan wrote:
>>> Why 12K small files from one directory to cause problems?
>>>
>>> # ll | wc -l
>>>    11467
>>>
>>> # grep X-PHP-Script * | more
>>> /sbin/grep: Argument list too long.
>>>
>>> # egrep X-PHP-Script *.ua | more
>>> /usr/sbin/egrep: Argument list too long.
>>>
>>> # cat *.ua | grep X-PHP-Script | more
>>> /sbin/cat: Argument list too long.
>>>
>>>
>>>
>>
>> Your shell can't process that many arguments. Use this:
>>
>> grep -R "X-PHP-Script" .
>>
>> or if you don't want to descent into subdirectories:
>>
>> find . -type -f -name '*.ua' -maxdepth 1 -exec grep "X-PHP-Script" {} \+

There is a typo, should be "-type f".

> This won't include file names and is gratuitously inefficient starting one
> grep per file.

But the final \+ means "{} is replaced with as many pathnames as 
possible for each invocation of utility.  This behaviour is similar to 
that of xargs(1)."

> The command you're looking for is:
>
> find . -type -f -name '*.ua' -maxdepth 1 -print0 | xargs -0 grep -H "X-PHP-Script"
>
> The find -print0 | xargs -0 allows filenames to contain spaces.  The
> grep -H is mostly theoretical in that the last grep invocation by xargs
> couple only include one file and thus wouldn't include the filename.

For fun, after running each of these several times to preload cache:

find /usr/ports -type f -print0 | xargs -0 grep -H "X-PHP-Script"
40.98 seconds (average)

find /usr/ports -type f -exec grep -H "X-PHP-Script" {} \+
42.27 seconds (average)

So they aren't too different in performance.


More information about the freebsd-fs mailing list