Como iterar um comando sobre um conjunto de arquivos?

4

Eu tenho uma pasta cheia de arquivos com uma extensão .dot como esta:

a.dot
b.dot
c.dot

Eu quero passar por todos os arquivos nesta pasta e executar um comando neles como este:

dot -Tpdf a.dot -o a.pdf
dot -Tpdf b.dot -o b.pdf
dot -Tpdf c.dot -o c.pdf

Acredito que preciso usar a barra vertical e fazer um comando assim:

ls *.dot | dot -Tpdf ... -o ....pdf

Mas eu não sei como fazer o pipe colocar cada arquivo apenas na parte central. Devo estar usando xargs ? Além disso, como extrair a extensão, coloque-a na segunda parte. Se eu pudesse ser pelo menos apontado na direção certa (qual comando shell usar), isso me ajudaria muito ao longo do caminho para descobrir isso.

    
por user 23.02.2012 / 15:41

3 respostas

6

Use

for i in *.dat ; do dot -Tpdf "$i" -o "$(basename "$i" dot)pdf" ; done

EDITAR: Manipulação correta de nomes de arquivos com espaços em branco.

    
por 23.02.2012 / 15:48
3

xargs é outro método para iterar sobre um conjunto de nomes de arquivos. No entanto, você não tem a mesma flexibilidade que um loop for para manipular o nome do arquivo em cada iteração:

ls *.dot | xargs -n1 -I FILE echo dot -Tpdf FILE -o FILE.pdf

resultará em

dot -Tpdf a.dot -o a.dot.pdf
dot -Tpdf b.dot -o b.dot.pdf
dot -Tpdf c.dot -o c.dot.pdf
    
por 23.02.2012 / 16:04
1

Se você é fã de awk e sed , também pode conseguir isso com

ls *.dot | awk '{print("dot -Tpdf "$1" -o "$1)}' | sed 's/.dot/.pdf/2' | sh
    
por 23.02.2012 / 16:52