Eu sugiro que você dê uma olhada em
sed # to manipulate text output from, for instance, ls
e
xargs # to use some std input to generate (many) new command lines
em combinação com a saída de um comando para a entrada do próximo (como de ls para sed para xargs)
Para dizer, você tem um diretório com o arquivo * tif e * tfw. Você quer fazer algo com os arquivos tif usando o arquivo tfw correspondente. Vamos supor também que para cada arquivo tif existe um arquivo tfw com exatamente o mesmo nome
# list all those tif files in one long column
ls -1 *.tif
# chop of the end .*tif leaving you with the base name
ls *.tif | sed -s 's/\.tif$//'
# feed the previous into xargs to tag a tif with the info in a tfw and
# create new geo_*.tif file
ls *.tif | sed -s 's/\.tif$//' | xargs -i -t geotifcp -e {}.tfw {}.tif geo_{}.tif
A última linha pode muito bem fazer o que você precisa em uma linha de comando longa (difícil de ler) sem script.
Para ajudar na compreensão, você também pode criar a lista de arquivos da seguinte maneira:
ls *tif> output.list
Depois limpe-o com sed para se certificar de que se comporta bem.
sed -s 's/\.tif$//' output.list > clean_output.list
end então use xargs com a opção -p em vez de -t para obter um prompt antes da emissão de cada comando:
cat clean_output.list | xargs -i -p geotifcp -e {}.tfw {}.tif geo_{}.tif
EDITAR :
Uma variação do primeiro é usar mais sed e menos xargs. Isso também é um pouco mais 'debuggable'. Isso requer que você aprenda um pouco sobre expressões regulares (que vale o esforço).
Essencialmente, pode-se gerar o texto do seu comando desejado inteiramente com o sed
sed -s 's/\(.*\)\.tif$/geotifcp -e .tfw .tif geo_.tif/' output.list > process.sh
Eu sei, regex parece horrível, mas aqui está a explicação aproximada do conteúdo nas citações simples:
's / A / B /' substitui A por B
A no nosso caso é (algo) .tif (note que temos que escapar dos parênteses)
O algo é armazenado em \ 1 e é usado para construir o comando geotifcp (que é B).