[shell script]

Ola.
Estou iniciando em shell (bash) e to com problemas na hora de listar arquivos de um diretorio, que tem espacos no nome.
Eu sei que quando faco algo parecido com:

for arquivo in $(ls /qualquer/diretorio);
do
    echo $arquivo;
done;

o que vai separar os ‘itens’ do for eh o caractere de espaco.
Como fazer entao pra que a variavel $arquivo cada hora contenha uma linha com o nome completo de um arquivo?
Tenho como mudar o qual caractere vai separar as variaveis do for?

pra quem tiver o mesmo problema…
eu estava entando fazer algo como:

a solucao eh usar um glob (*.txt)

exemplo:

[quote]for file in *.txt
do
mv file txts
done[/quote]

tentar processar o resultado do ls num script bash eh considerado uma mah pratica

O problema é entender algumas substituições que o Bash faz :wink:

quando vc faz

for i in $(comando) ; do

done

O bash vai interpretar linha a linha, caracter a caracter até encontrar o $(

ai ele fica esperto: humm… tenho q substituir o que vem a seguir pelo resultado do comando entre ‘$(’ e ‘)’.

se o comando retornar “um dois tres”, isso passa a ser

for i in um dois tres; do

done

Agora… se vc tem um arquivo chamado “um dois tres”, o for não vai entender, por causa do IFS.

IFS - input field separator. vc esta usando no nome do arquivo um caracter que é separador de campos/parametros. ai o for se confunde.

Vc pode fazer 2 coisas: uma ganbiarra pra proteger o nome desse arquivo

for i in “$(ls -Q)” ; do

done

Que geralmente não funciona 100% dos casos e é muito dependente de plataforma.

Ou vc pode usar um conjunto mais inteligente de ferramentas para este fim!

$ ls -l
total 0
-rw-r–r-- 1 xxx Nenhum 0 Jul 27 12:33 tres
-rw-r–r-- 1 xxx Nenhum 0 Jul 27 12:33 um dois

$ find . -type f -print0 | xargs --null -n 1
./tres
./um dois

fica a dica: de uma olhada no man do find/xargs – tem uma surpresa reservada pra vc :wink:

bela surpresa :wink: :

[quote=man xargs] Because Unix filenames can contain blanks and newlines, this default
behaviour is often problematic; filenames containing blanks and/or new-
lines are incorrectly processed by xargs. In these situations it is
better to use the -0 option, which prevents such problems. When using
this option you will need to ensure that the program which produces the
input for xargs also uses a null character as a separator. If that
program is GNU find for example, the -print0 option does this for you.[/quote]

comparando as alternativas no cygwin:

  1. $ for file in "$(ls -Q)"; do echo "um arquivo: $file"; done um arquivo: "Cygwin.lnk" "bash" "docs" "gvim - Atalho.lnk" "instaladores" "lastfm.sh" "p261-knuth.pdf" "paper.pdf" "scheme" "wiz.zip"

  2. $ for file in *; do echo "um arquivo: $file"; done um arquivo: Cygwin.lnk um arquivo: bash um arquivo: docs um arquivo: gvim - Atalho.lnk um arquivo: instaladores um arquivo: lastfm.sh um arquivo: p261-knuth.pdf um arquivo: paper.pdf um arquivo: scheme um arquivo: wiz.zip

a proposito, vc conhece esse guia?

procurando na internet depois, achei esse link bacana falando do xargs… eu não usava muito a ferramenta