Autor Tópico: Script com problema com arquivos/diretórios que contém espaço  (Lida 5871 vezes)

Offline lightboy

  • Usuário Ubuntu
  • *
  • Mensagens: 178
    • Ver perfil
Script com problema com arquivos/diretórios que contém espaço
« Online: 10 de Junho de 2009, 17:08 »
Estou criando um script para renomear vários arquivos e pastas simultaneamente. Preciso que ele funcione assim no terminal:

Código: [Selecionar]
./script caminho/arquivo1 caminho/arquivo2 caminho/arquivo3 ...
O script funciona legal, exceto quando há espaço no nome um arquivo ou diretório. E é nesse ponto que estou pedindo ajuda.

Segue o script:

Código: [Selecionar]
#!/bin/bash
# Nome: Renomear vários arquivos...
# Autor: Cristiano Almeida
# E-mail: cristiano.almeida@gmail.com
# Última modificação: 10/06/2009
# Baseado em http://benincampus.blogspot.com/2009/03/mass-sequential-rename.html

TITLE="Renomear..."
MSG="Prefixo dos novos nomes dos arquivos:"
NUM=1

EXPR=`zenity --title "$TITLE" --entry --text "$MSG" --entry-text "$EXPR"` || exit

for FILE in $*;do
  cd "`dirname "$FILE"`"
  filename=""`basename "$FILE"`""
  EXT="${filename/*./}"

  if test "`basename "$FILE"`" = "$EXT";then
    mv ""`basename "$FILE"`"" "$EXPR ($NUM)"
  else
    mv ""`basename "$FILE"`"" "$EXPR ($NUM).$EXT"
  fi

  NUM=$((NUM+1))
done

Agradeço a ajuda, pessoal.
Linux user #491316 | Ubuntu user #27683

Offline Gunfree

  • Usuário Ubuntu
  • *
  • Mensagens: 208
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #1 Online: 11 de Junho de 2009, 03:03 »
Escape os espaços ou simplesmente use o xargs :)

[]'s
Linux Registered User: #491793

Offline lightboy

  • Usuário Ubuntu
  • *
  • Mensagens: 178
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #2 Online: 12 de Junho de 2009, 09:03 »
Escape os espaços ou simplesmente use o xargs :)

[]'s

Desculpe, Gunfree, mas em criação de script no Linux eu só sei o basicão mesmo. Até pesquisei sobre sua dica mas não consegui usar. É possível uma ajudinha a mais, aí?
Linux user #491316 | Ubuntu user #27683

Offline Gunfree

  • Usuário Ubuntu
  • *
  • Mensagens: 208
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #3 Online: 12 de Junho de 2009, 09:52 »
Isso é o basicão do bash, mas como amo Shell Script, te ajudarei com muito prazer :D

Por exemplo, se eu quiser acessar um diretório que tenha espaço, preciso avisar ao interpretador que o diretório tem espaço. Se não, por default, o bash acredita que o espaço é o delimitador de argumento.

Exemplo prático para você visualizar:

Código: [Selecionar]
[gunter@gunter ~]$ mkdir teste
[gunter@gunter ~]$ cd teste
[gunter@gunter teste]$ mkdir dir com espaco
[gunter@gunter teste]$ ls -la
total 20
drwxrwxr-x  5 gunter gunter 4096 2009-06-12 09:51 .
drwx------ 34 gunter gunter 4096 2009-06-12 09:51 ..
drwxrwxr-x  2 gunter gunter 4096 2009-06-12 09:51 com
drwxrwxr-x  2 gunter gunter 4096 2009-06-12 09:51 dir
drwxrwxr-x  2 gunter gunter 4096 2009-06-12 09:51 espaco
[gunter@gunter teste]$ rm -rf dir com espaco
[gunter@gunter teste]$ ls -la
total 8
drwxrwxr-x  2 gunter gunter 4096 2009-06-12 09:51 .
drwx------ 34 gunter gunter 4096 2009-06-12 09:51 ..
[gunter@gunter teste]$ mkdir dir\ com\ espaco
[gunter@gunter teste]$ ls -la
total 12
drwxrwxr-x  3 gunter gunter 4096 2009-06-12 09:52 .
drwx------ 34 gunter gunter 4096 2009-06-12 09:51 ..
drwxrwxr-x  2 gunter gunter 4096 2009-06-12 09:52 dir com espaco
[gunter@gunter teste]$

Linux Registered User: #491793

Offline lightboy

  • Usuário Ubuntu
  • *
  • Mensagens: 178
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #4 Online: 12 de Junho de 2009, 10:39 »
Aí que tá, isso que você explicou agora eu já sei e já tomo cuidado. É basicão.  ;D Sempre uso o comando com arquivo\ com\ espaço assim. Porém, mesmo assim, o script está dando esse problema.
Linux user #491316 | Ubuntu user #27683

Offline Gunfree

  • Usuário Ubuntu
  • *
  • Mensagens: 208
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #5 Online: 12 de Junho de 2009, 11:42 »
Experimenta fazer um exec antes de rodar teu script

Código: [Selecionar]
exec < lista_dos_seus_arquivos
while read i ; do
       /path/seu_script.sh "$i"
done

[]'s
Linux Registered User: #491793

Offline lightboy

  • Usuário Ubuntu
  • *
  • Mensagens: 178
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #6 Online: 15 de Junho de 2009, 10:06 »
Por favor me diga se eu estiver fazendo algo errado.

Dei o nome de mass-renamer.sh ao meu script. Criei outro script chamado teste.sh adaptando o que você me passou.

Código: [Selecionar]
#!/bin/bash
exec < $*
while read i ; do
       ./mass-renamer.sh "$i"
done

Executando, recebi mensagem de erro e o novo script travou:

Código: [Selecionar]
./teste.sh foto.jpg imagem\ teste.jpg
./teste.sh: line 2: $*: redirecionamento ambíguo
^C
Linux user #491316 | Ubuntu user #27683

Offline Solid One

  • Usuário Ubuntu
  • *
  • Mensagens: 276
  • Linux for human beings
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #7 Online: 19 de Junho de 2009, 15:16 »
dá pra usar também mkdir "dir com espaco" ao invés de mkdir dir\ com\ espaco.

Offline lightboy

  • Usuário Ubuntu
  • *
  • Mensagens: 178
    • Ver perfil
Re: Script com problema com arquivos/diretórios que contém espaço
« Resposta #8 Online: 22 de Junho de 2009, 10:17 »
dá pra usar também mkdir "dir com espaco" ao invés de mkdir dir\ com\ espaco.

Deixe eu explicar melhor meu problema... Esse script precisa funcionar direitinho no terminal pois executarei ele através de um pacote do nautilus que, graficamente, o chama como se fosse ./script caminho/arquivo1 caminho/arquivo2 caminho/arquivo3 rodando pelo terminal. E esse pacote (nautilus-actions) automaticamente coloca barras\ nos\ espaços, mas não coloca "aspas no início e no fim dos arquivos". Sendo que eu também já tinha testado usar aspas pelo terminal e não havia adiantado. Se conseguir que funcione direito no terminal, automaticamente resolvo para usar o script pelo nautilus-actions.

O script está todo aí no tópico... se por favor conseguirem me ajudar, agradeço muito.
Linux user #491316 | Ubuntu user #27683