(5 respuestas)
Cerrado hace 6 años.
Cuando xargs redirige la salida del primer comando al argumento del segundo comando y no hay elección sobre qué argumento para qué elemento de la salida, entonces solo hay una forma, por ejemplo:
ls | xargs file # there are as many arguments as files in the listing,
# but the user does not have too choose himself
ahora si hay necesidad de elección:
ls | xargs file | grep image | xargs mv..... # here the user has to
# deal with two arguments of mv, first for source second for destination, suppose your destination argument is set already by yourself and you have to put the output into the source argument.
¿Cómo le dices a xargs que redirija la salida estándar del primer comando al argumento de tu elección del segundo comando?
Respuesta aceptada:
Puedes usar -I
para definir un marcador de posición que se reemplazará con cada valor de los argumentos alimentados a xargs
. Por ejemplo,
ls -1 | xargs -I '{}' echo '{}'
llamará a echo
una vez por línea de ls
la salida. A menudo verás '{}'
usado, presumiblemente porque es lo mismo que find
marcador de posición.
En su caso, también necesita preprocesar file
's de salida para extraer los nombres de archivo coincidentes; ya que hay un grep
ahí solo podemos usar awk
para hacer ambas cosas y simplificar el file
invocación también:
file * | awk -F: '/image/ { print $1 }' | xargs -I '{}' mv '{}' destination
Si tienes GNU mv
podrías simplemente usar -t
para pasar múltiples archivos fuente:
file * | awk -F: '/image/ { print $1 }' | xargs mv -t destination