Argument list too long

Chris Rees crees at FreeBSD.org
Fri Mar 8 21:43:00 UTC 2013


On 8 Mar 2013 20:05, "Warren Block" <wblock at wonkity.com> wrote:
>
> 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.

The \+ form I have also found impossible to achieve in csh, which is why I
never recommend it.

Chris (Rees not Ross :)


More information about the freebsd-fs mailing list