Fazendo loop de um comando sobre uma lista de argumentos no Linux

4

Como executar o mesmo comando com argumentos que são entregues por outro comando via pipe?

Como resultado da extração de nomes de arquivos de uma fonte, recebo:

    $some_command
    filename1
    filename2
    filename3
    ...
    filenameN

Gostaria de criar arquivos com esses nomes de arquivos com touch . Como posso fazer um loop de touch sobre esses nomes?

    
por Alex 01.07.2009 / 19:50

5 respostas

7

Eu só uso para ... fazer ... feito para casos muito simples.

Para cenários mais complicados / perigosos:

command | sed 's/^/touch /'

Isso não faz nada além de imprimir os comandos pretendidos. Revise os resultados e, em seguida, execute a mesma coisa para sh -x (o sinal -x é para depuração):

command | sed 's/^/touch /' | sh -x
    
por 01.07.2009 / 20:00
11

Você pode usar xargs com -n1 para executar um comando uma vez para cada argumento canalizado

$some_command | xargs -n 1 touch

No caso do toque, no entanto, que aceita vários argumentos

touch '$some_command' 

provavelmente funcionará para você.

    
por 01.07.2009 / 19:57
4
for i in '$some_command'; do touch $i; done
    
por 01.07.2009 / 19:52
2

Se os nomes dos arquivos contiverem espaços em branco, os seguintes itens funcionarão em torno deles:

some_command | while read filename ; do touch "$filename" ; done

Isso criará arquivos nomeados:
nome do arquivo 1
nome de arquivo 2
arquivo nomeado 3
etc

Supondo, claro, que produza esses nomes.

    
por 01.07.2009 / 22:05
1

"some_command | xargs touch" provavelmente fará o truque, mas há duas armadilhas:

  1. Se um nome de arquivo contiver algum caractere de espaço em branco, ele será tratado como um separador, por exemplo, um nome de arquivo "fuh bar" será "tocado" como um arquivo chamado "fuh" e outro chamado "bar" em vez de um único "fuh bar" um. Para aliviar isso, você pode verificar se o seu "some_command" é capaz de produzir outro delimitador, muitas vezes NULL (veja o argumento "-print0" legit com o comando "find"), e use o argumento "- null" do xargs
  2. Se o comando não produzir nada, os xargs falharão miseravelmente. Use seu argumento "--no-run-if-empty"
por 01.07.2009 / 21:52

Tags