sábado, 25 de julho de 2015

Processando arquivos e strings contendo espaços no Bash

A última vez que eu escrevi um script decente em bash foi em 2001. Lá se vão vários anos, até que eu esquecesse totalmente de como programar em bash. Tornei-me monolíngue em C.
Gozado, o que exige-se de um usuário de Windows é que saiba clicar no botão iniciar (ainda existe? Deixei de usar este "sistema" ainda na versão 95) e usar o pacote de escritórios da Microsoft. Já o que se exige de um usuário GNU/Linux é que ele tenha seja onisciente em computação... E isso é bom. Um dia chego à perfeição. :-D

Tive problemas com com arquivos cujos nomes continham espaços.
O delimitador de campos do bash é o espaço. Para lidar com nomes e strings contendo espaço (e fazer com que tudo seja interpretado como um único campo), podemos mudar para próxima linha.
A variável IFS é a responsável para mudar este delimitador.

Ao digitar no bash (por uma sessão), ou no script
IFS=$'\n' (ou IFS=$ \n) ,
altera-se o delimitador de campo, e aí conseguimos processar strings que contenham espaço, como nomes de arquivos com espaço.
\n é o caractere de próxima linha também no bash (velho conhecido de quem usa C).

Um comentário:

  1. Atenágoras,

    Precisava converter um conjunto de 1000 arquivos *.eml para maildir.
    O problema era que quando eu fazia o looping com for dava merd.., porque o
    for considera o separador IFS para fazer a separação dos itens da lista.
    Por sorte, me deparei com seu post e usando sua dica consegui fazer a conversão de todos arquivos de uma só vez:

    IFS=$'\n'
    for i in $(ls | grep eml); do getmail_maildir ~/remota/homedata/offlineimap/pendentes/ < $i ; done

    ResponderExcluir