Script com problema com arquivos/diretórios que contém espaço

Iniciado por lightboy, 10 de Junho de 2009, 17:08

tópico anterior - próximo tópico

lightboy

Estou criando um script para renomear vários arquivos e pastas simultaneamente. Preciso que ele funcione assim no terminal:

./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:

#!/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

Gunfree

Linux Registered User: #491793

lightboy

Citação de: Gunfree online 11 de Junho de 2009, 03: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

Gunfree

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:


[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

lightboy

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

Gunfree

Experimenta fazer um exec antes de rodar teu script

exec < lista_dos_seus_arquivos
while read i ; do
       /path/seu_script.sh "$i"
done


[]'s
Linux Registered User: #491793

lightboy

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.

#!/bin/bash
exec < $*
while read i ; do
       ./mass-renamer.sh "$i"
done


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

./teste.sh foto.jpg imagem\ teste.jpg
./teste.sh: line 2: $*: redirecionamento ambíguo
^C

Linux user #491316 | Ubuntu user #27683

Solid One

dá pra usar também mkdir "dir com espaco" ao invés de mkdir dir\ com\ espaco.

lightboy

Citação de: Solid One 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.

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