Como dizer ao xargs qual argumento escolher? [duplicado]

9

Quando xargs redireciona a saída dos primeiros comandos para o segundo argumento do comando e não há escolha sobre qual argumento para qual elemento da saída, então existe apenas uma maneira, por exemplo:

ls | xargs file  # there are as many arguments as files in the listing,
                 # but the user does not have too choose himself

agora, se houver necessidade de escolha:

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. 

Como você diz ao xargs para redirecionar a saída padrão do primeiro comando para o argumento de sua escolha do segundo comando?

    
por Abdul Al Hazred 02.04.2015 / 18:04

1 resposta

21

Você pode usar -I para definir um marcador de lugar que será substituído por cada valor dos argumentos alimentados para xargs . Por exemplo,

ls -1 | xargs -I '{}' echo '{}'

chamará echo uma vez por linha da saída de ls . Você geralmente verá '{}' usado, presumivelmente porque é o mesmo que o espaço reservado de find .

No seu caso, você também precisa pré-processar a saída de file para extrair os nomes dos arquivos correspondentes; como há um grep , podemos usar apenas awk para fazer ambos e simplificar também a invocação de file :

file * | awk -F: '/image/ { print $1 }' | xargs -I '{}' mv '{}' destination

Se você tem o GNU mv , pode usar apenas -t para passar vários arquivos de origem:

file * | awk -F: '/image/ { print $1 }' | xargs mv -t destination
    
por 02.04.2015 / 18:31