"xargs" generating lines shorter than ARG_MAX

From: Joerg Bruehe (joerg@sql.de)
Date: Wed Jun 26 2002 - 11:24:04 EDT


Dear admins,

I encounter difficulties with the "xargs" command:

  In a directory tree, I want to find out which files were
  modified last. So I enter:

    find . -type f -mtime -3 -print | xargs ls -ltrd | more

  However, I get a "ls" output with date/time increasing from
  "Jun 24" to "Jun26" (= today) in the first 68 lines,
  then jumping back to "Jun 24" and again increasing to "Jun26"
  in the next 70 lines, the same happening in the next 97 lines,
  ... - in total my 551 output lines consist of 7 (seven) blocks
  with ascending date/time only within each block.

My only explanation is that "ls" is called 7 times, each time
with a partial list of files. I would happily accept that behaviour
if the list of files were too long for a single call, but:

a) find . -type f -mtime -3 -print | wc
   yields "551 551 13005"
   which is far less than "ARG_MAX" (38912), and my environment
   occupies only 180 bytes ("env | wc" yields "10 10 180"), and

b) ls -ltrd `find . -type f -mtime -3 -print`
   works perfect (and yields 551 lines), so the file list really
   does fit into a single call.

To test that further, I wrote me a simple script "tmpsh" that does
   echo $* | wc
and called
   find . -type f -mtime -3 -print | xargs tmpsh
which gave me seven lines, the first six with 2011 .. 2021 byte
argument size and the last one with 923. So it seems that "xargs"
does limit the generated line to about 2 kB (and not the
ridiculous 470 byte given in the man page).
Using the "-s" parameter to "xargs", I could reduce the length
but not increase it, but got no error message (on large values).

Do you have any idea why the command line generated by "xargs"
is so much shorter than what is obviously possible,
or any hint how I could increase the line length towards "ARG_MAX"?

My environment:
The OS is version 4.0 D (878) upgraded fron 4.0 B (564),
"xargs" is version 4.2.8.2 ("which xargs" -> "/usr/bin/xargs"),
the shell is the system-supplied "/usr/bin/csh" ("sh.c": 4.2.37.3),
with the Bourne-compatible "/usr/bin/sh" the effect is the same.

Regards and TIA,
Joerg Bruehe

-- 
Joerg Bruehe, SQL Datenbanksysteme GmbH, Berlin, Germany
     (speaking only for himself)
mailto: joerg@sql.de


This archive was generated by hypermail 2.1.7 : Sat Apr 12 2008 - 10:48:44 EDT