(5 risposte)
Chiuso 6 anni fa.
Quando xargs reindirizza l'output del primo comando nell'argomento del secondo comando e non è possibile scegliere quale argomento per quale elemento dell'output, allora c'è solo un modo, ad esempio:
ls | xargs file # there are as many arguments as files in the listing,
# but the user does not have too choose himself
ora se c'è bisogno di scelta:
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.
Come fai a dire a xargs di reindirizzare l'output standard del primo comando nell'argomento di tua scelta del secondo comando?
Risposta accettata:
Puoi usare -I
per definire un segnaposto che verrà sostituito con ogni valore degli argomenti forniti a xargs
. Ad esempio,
ls -1 | xargs -I '{}' echo '{}'
chiamerà echo
una volta per riga da ls
l'uscita. Vedrai spesso '{}'
usato, presumibilmente perché è lo stesso di find
segnaposto.
Nel tuo caso, devi anche pre-elaborare file
's output per estrarre i nomi di file corrispondenti; poiché esiste un grep
lì dentro possiamo semplicemente usare awk
per fare entrambe le cose e semplificare il file
anche l'invocazione:
file * | awk -F: '/image/ { print $1 }' | xargs -I '{}' mv '{}' destination
Se hai GNU mv
potresti semplicemente usare -t
per passare più file di origine:
file * | awk -F: '/image/ { print $1 }' | xargs mv -t destination