2011-06-29 21 views
5

considerar lo siguiente:¿Por qué xargs -L produce el formato correcto, mientras que xargs -n no?

$ echo index.html* | xargs -L 1 ls -l 
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:18 index.html 
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:20 index.html.1 
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:21 index.html.2 
-rw-r--r-- 1 zeki zeki 146589 2011-05-05 12:29 index.html.3 
$ echo index.html* | xargs -n 1 ls -l 
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:18 index.html 
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:20 index.html.1 
-rw-r--r-- 1 zeki zeki 17198 2011-05-03 23:21 index.html.2 
-rw-r--r-- 1 zeki zeki 146589 2011-05-05 12:29 index.html.3 

¿Por qué dió la opción -n un formato incorrecto? Por las dudas, estoy usando bash en Ubuntu. Gracias.

Respuesta

12

-L splits by lines; echo no separa su salida por líneas sino por espacios, por lo que se ejecuta un solo ls -l y formatea todas las columnas como un grupo.

-n splits por parámetros; en ausencia de -L o -0, el separador es un espacio en blanco (posiblemente modificado por comillas), por lo que cada nombre de archivo obtiene su propia ejecución ls -l y no hay forma de que las ejecuciones independientes coordinen los anchos de columna.

+0

se me adelantó, 1. –

+0

Gracias! Ahora está claro. –

3

El POSIX estándar mandates:

-Lnúmero

La utilidad se ejecuta para cada no vacíos numberlíneas de argumentos de entrada estándar. La última invocación de la utilidad debe ser con menos líneas de argumentos si quedan menos de un número. Se considera que una línea termina con la primera a menos que el último carácter de la línea sea <blank>; un trailing <blank> señala la continuación a la siguiente línea no vacía, inclusive.

-nnúmero

utilidad Invoke utilizando como muchos de entrada estándar argumentos como sea posible, hasta número (un decimal entero positivo) argumentos máximo.

(Énfasis añadido). Como echo * produce una sola línea, xargs -L 1 simplemente alimenta todos los nombres de archivo a ls a la vez, y sólo entonces puede ls bien alinear las columnas.

(En otras palabras, el primer comando es equivalente ls -l index.html*, excepto que no controla correctamente los nombres de archivo que contienen espacios en blanco.)

+0

¡Gracias también! –

Cuestiones relacionadas