2009-11-04 12 views
5

Me gustaría saber cómo usar el contenido de un archivo como argumentos de línea de comando, pero estoy luchando con la sintaxis.Usar el contenido del archivo como argumento de línea de comando en BASH

Di Tengo el siguiente:

# cat > arglist 
src/file1 dst/file1 
src/file2 dst/file2 
src/file3 dst/file3 

¿Cómo puedo usar el contenido de cada línea en el archivo arglist como argumentos para decir, un comando cp?

Respuesta

7

la opción '-n' para xargs especifica cuántos argumentos a utilizar por orden:

$ xargs -n2 < arglist echo cp 

cp src/file1 dst/file1 
cp src/file2 dst/file2 
cp src/file3 dst/file3 
+0

¿cómo funciona '<'? – Michelle

1

Se puede utilizar tubería (|):

cat file | echo 

o redirección de entrada (<)

cat < file 

o xargs

xargs sh -c 'emacs "[email protected]" < /dev/tty' emacs 

entonces puede usar awk para obtener argumentos:

cat file | awk '{ print $1; }' 

Espero que esto ayude ..

+0

hay necesidad cat for the awk piece – ghostdog74

+0

Todos estos _something_ pero todos están fuera de objetivo. – Jamie

+0

'echo' no lee de' stdin'. Además 'cat' no necesita' echo'. Además, no tiene que redireccionar a 'cat' - esto funciona:' cat file'. –

3

Usando read (esto suponga que todos los espacios en los nombres de archivo en arglist se escaparon):

while read src dst; do cp "$src" "$dst"; done < argslist 

Si los argumentos en el archivo están en el orden correcto y nombres de archivo con espacios se citan, entonces esto va a funcionar también:

while read args; do cp $args; done < argslist 
+0

+1 Mucho mejor que mi solución :-D – NawaMan

+0

un ciclo de lectura se "perderá" al leer la última línea si no hay una última línea nueva. – ghostdog74

0

si su propósito es sólo a Cp esos archivos en lalista

$ awk '{cmd="cp "$0;system(cmd)}' file 
+0

Martillos? ¿Uñas? –

+0

no es diferente cuando lo haces con shell. shell también está llamando al comando del sistema. – ghostdog74

0

Uso for bucle con IFS (Separador de campo interno) ajustado en new line

OldIFS=$IFS # Save IFS 
$IFS=$'\n' # Set IFS to new line 
for EachLine in `cat arglist"`; do 
Command="cp $Each" 
`$Command`; 
done 
IFS=$OldIFS 
+0

No es necesario poner el comando y sus argumentos en una variable. De todos modos, tendrías que hacer '$ Command' o' \ '$ Command \' 'para que funcione. –

+0

Gracias, extraño eso: D – NawaMan

Cuestiones relacionadas