você está aqui: Home  → Arquivo de Mensagens

Comando "for" com nomes de arquivos contendo espaços

Colaboração: Clovis Reis

Data de Publicação: 15 de fevereiro de 2013

Por diversas vezes encontrei problemas ao utilizar um comando "for" onde os argumentos possuiam espaços em branco. Por exemplo:

  bash$ for i in `ls *.jpg`; do echo $i; done;

Neste caso, seria de se esperar o seguinte resultado:

  foto1.jpg
  foto2.jpg
  foto3.jpg

Porém, caso o comando "for" encontre o arquivo chamado "foto das ferias.jpg", obteremos o seguinte resultado:

  foto1.jpg
  foto2.jpg
  foto3.jpg
  foto
  das
  ferias.jpg

Isso ocorre porque o comando "for" usa como delimitador de campo o espaço em branco. Para solucionar o problema, basta modificar o conteúdo da variável IFS algo mais conveniente, tal como um "\n"

A variável IFS ou Internal Field Separator é usada para separar argumentos dentro de uma linha quando utilizamos um comando builtin. Seu valor default é um espaço em branco.

Assim, antes de usar o comando "for" ou qualquer outro que se "atrapalhe" com os espaços em branco, basta setar IFS com o valor adequado:

  bash$ IFS=$ \n

e usar o comando normalmente



Veja a relação completa dos artigos de Clovis Reis

 

 

Opinião dos Leitores

Luiz Gustavo Rodrigues de Oliveira
16 Fev 2013, 22:38
for i in *.jpg; do echo "$i"; done

foto1.jpg
foto2.jpg
foto3.jpg
foto das ferias.jpg


Para listar todos os jpg's, não precisa colocar o comando de listar, somente do "*.jpg" ele já reconhece. E o problema com o nome ter o espeço, é só você colocar a variável (que neste caso foi a 'i') entre aspas ( "$i" ), assim ele coloca no nomes dos arquivos.
Ivan de Gusmão Apolonio
16 Fev 2013, 10:55
Legal! Muito útil esta dica!!

Obrigado!
Tafarel Carvalho
15 Fev 2013, 22:07
Algumas vezes fiz um engenhoca louca pra contornar isso, do seu modo seria mais fácil,

mas assim funciona sem problemas:

for x in *;do echo $x ;done

Silvio Bandeira
15 Fev 2013, 17:27
O comando correto para atribuir um valor a IFS é:

bash$ IFS=$'\n'

com os caracteres entre aspas simples.
Tiago Peczenyj
15 Fev 2013, 14:02
O que aconteceu com o usar o comando for apenas?

for image in *.jpg ; do echo $image ; done
Matias Schweizer
15 Fev 2013, 11:39
lembrando que mudar o IFS pode gerar resultados estranhos no script. Por isso, é bom salvar e voltar:

OLDIFS=$IFS
IFS=...
comandos
IFS=$OLDIFS
Raul Libório
15 Fev 2013, 10:46
Muito bem pensado. Parabéns!
Thiago
15 Fev 2013, 10:31
O que aconteceu com o velho "find"?

find . -name \*.jpg -exec ls -la {} \;

*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script