2010-04-26 14 views

Respuesta

139

Es probable que sea más fácil de usar xargs. En su caso:

ls -1 | xargs -L1 echo 
+15

'ls' hace automáticamente' -1' en una tubería. –

+5

@Dennis, no se ve así: 'ls | xargs -L2 echo' y 'ls -1 | xargs -L2 echo' da dos salidas diferentes. El primero es todo en una línea. –

+1

@Alex: obtengo el mismo resultado. –

8

Puede utilizar un for loop:

 
for file in * ; do 
    echo "$file" 
done 

Tenga en cuenta que si el comando en cuestión acepta varios argumentos, a continuación, utilizando xargs es casi siempre más eficiente, ya que sólo tiene que generar la utilidad de que se trate, una vez en lugar de múltiples veces.

+1

Vale la pena describir el uso adecuado/seguro de xargs, es decir. 'printf '% s \ 0' * | xargs -0 ... '- de lo contrario, es bastante inseguro con los nombres de archivo con espacios en blanco, comillas, etc. –

98

Se puede utilizar una operación de base de Prefijo en cada línea:

ls -1 | while read line ; do echo $line ; done 

O puede canalizar la salida de sed para operaciones más complejas:

ls -1 | sed 's/^\(.*\)$/echo \1/' 
+0

El comando sed no parece funcionar:' sh: cho: no encontrado un sh: cho: no encontrado' como tomar el 'e' en echo para ser un comando sed o algo así. –

+0

+1 para el bucle 'while'. 'cmd1 | mientras lee la línea; hacer cmd2 $ línea; hecho'. O 'mientras lee la línea; hacer cmd2 $ línea; done <<(cmd1) 'que no crea una subcadena. Esta es la versión simplificada de su comando 'sed':' sed 's /.*/ echo & /' ' –

+1

@Alex: cambie las comillas dobles por comillas simples. –

2
for s in `cmd`; do echo $s; done 

Si cmd tiene una gran salida:

cmd | xargs -L1 echo 
+6

si 'cmd' tiene espacios en su salida, el primero fallará. –

+0

http://mywiki.wooledge.org/DontReadLinesWithFor, http://mywiki.wooledge.org/BashPitfalls entry # 1 –

6

En realidad puede usar sed para hacerlo, siempre y cuando esté sed de GNU.

... | sed 's/match/command \0/e' 

Cómo funciona: partido

  1. Sustituto con el partido de comandos
  2. en la sustitución de comandos
  3. ejecutar Reemplazar línea sustituido con salidas de comandos.
+0

Fantástico. Olvidé poner el comando ** e ** al final, pero lo hice después de ver tu respuesta y funcionó. Intentaba agregar una identificación aleatoria entre 1000 y 15000, cuando SED coincide con una línea. 'cat /logs/lfa/Modified.trace.log.20150904.pw | sed -r 's/^ (. *) (\ | 006 \ | 00032 \ |) (. *) $/echo "\ 1 \ 2 \ 3 - ID \' shuf -i 999-14999 -n 1 \ ' "/ e '' – sgsi

0

mejor resultado para mí:

ls -1 | xargs -L1 -d "\n" CMD 
+0

Mejor, pero no perfecto. 'encontrar. -mindepth 1 -maxdepth 1 -print0 | xargs -0 command' manejará casos donde la salida de 'ls -1' es ambigua; use '-printf '% P \ 0'' en lugar de' -print0' si no desea un '. /' inicial en cada uno. –

0

xargs con falla con barras invertidas, de citas. Tiene que ser algo así como

ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file." 

xargs -0 opción:

-0, --null 
      Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are 
      not special (every character is taken literally). Disables the end of file string, which is treated like 
      any other argument. Useful when input items might contain white space, quote marks, or backslashes. The 
      GNU find -print0 option produces input suitable for this mode. 

ls -1 pone término a los elementos, con caracteres de nueva línea, por lo tr las traduce en caracteres nulos.

Este enfoque es unas 50 veces más lenta que la iteración de forma manual con for ... (véase la respuesta Michael Aaron Safyan s) (3.55s vs 0.066s). Pero para otros comandos de entrada como localizar, buscar, leer desde un archivo (tr \\n \\0 <file) o similar, debe trabajar de esta manera con xargs.

Cuestiones relacionadas