como passar a variável string como argumento globbing ao comando

1

Eu tenho um diretório com alguns arquivos tif que eu quero mesclar, dependendo dos sufixos do arquivo (observe os espaços nos nomes dos arquivos):

File1 P1.tif
File1 P2.tif
File1 P3.tif
File2 P1.tif
File2 P2.tif

deve resultar em tifs mesclados:

File1.tif
File2.tif

Eu tenho

for i in *\ P1.tif; do
    match=${i/\ P1/\ P*}
    out=${i/\ P1/}
    echo "processing $match"
    tiffcp "$match" "$out"
done

$match conterá File1 P*.tif e $out conterá File1.tif . mas o tiffcp lidará com o primeiro argumento como uma string e não encontrará um arquivo correspondente. se a não usar aspas em torno de $match , os espaços nos nomes dos arquivos resultarão em nenhum arquivo correspondente

então a questão é: como eu passo uma string globbing como um argumento para um comando?

    
por Jan S 01.11.2018 / 16:53

1 resposta

2

Se você quiser que o globbing seja executado na expansão do parâmetro (que, a propósito, é executado pelo shell, antes de chamar o comando; o comando vê os arquivos resultantes, não o padrão), é aí que você deixaria o parâmetro expansão sem aspas.

Deixar uma expansão de parâmetro sem aspas indica tanto a divisão de palavras quanto a globulação (às vezes chamada de divisão conceitual + operador glob). Aqui, você quer apenas a parte de globbing, então você precisa desabilitar a parte de divisão (atribuindo um valor vazio à variável $IFS especial):

IFS= # disable splitting
for i in ./*\ P1.tif; do
    match=${i/\ P1/\ P*}
    out=${i/\ P1/}
    echo "processing $match"
    tiffcp $match "$out" # split+glob on $match
done

Isso pressupõe que a parte principal do nome do arquivo não contenha caracteres curinga. Alternativamente, você poderia fazer:

for i in ./*\ P1.tif; do
    prefix=${i%\ P1.tif}
    out=$prefix.tif
    echo "processing $prefix"
    tiffcp "$prefix P"*.tif "$out"
done

Dessa forma, somente esse * é considerado como um operador glob, e esse código também tem a vantagem de usar apenas a sintaxe sh padrão.

Note que as expansões glob são classificadas lexicalmente, então P10 viria antes de P2. Use zsh e sua opção numericglobsort (ou n qualifier glob) para classificação numérica.

    
por 01.11.2018 / 17:15

Tags