My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# ----------------------------------------------------------------------------
# Renomeia arquivos do diretório atual, arrumando nomes estranhos.
# Obs.: Ele deixa tudo em minúsculas, retira acentuação e troca espaços em
# branco, símbolos e pontuação pelo sublinhado _.
# Opções: -n apenas mostra o que será feito, não executa
# -d também renomeia diretórios
# -r funcionamento recursivo (entra nos diretórios)
# Uso: zzarrumanome [-n] [-d] [-r] arquivo(s)
# Ex.: zzarrumanome *
# zzarrumanome -n -d -r . # tire o -n para renomear!
# zzarrumanome "DOCUMENTO MALÃO!.DOC" # fica documento_malao.doc
# zzarrumanome "RAMONES - Don't Go.mp3" # fica ramones-dont_go.mp3
#
# Autor: Aurelio Marinho Jargas, www.aurelio.net
# Desde: 2001-07-23
# Licença: GPL
# Requisitos: zzarrumanome zzminusculas
# ----------------------------------------------------------------------------
zzarrumanome ()
{
zzzz -h arrumanome "$1" && return

local arquivo caminho antigo novo recursivo pastas nao i

# Opções de linha de comando
while [ "${1#-}" != "$1" ]
do
case "$1" in
-d) pastas=1 ;;
-r) recursivo=1 ;;
-n) nao="[-n] " ;;
* ) break ;;
esac
shift
done

# Verificação dos parâmetros
[ "$1" ] || { zztool uso arrumanome; return 1; }

# Para cada arquivo que o usuário informou...
for arquivo
do
# Tira a barra no final do nome da pasta
[ "$arquivo" != / ] && arquivo=${arquivo%/}

# Ignora arquivos e pastas não existentes
[ -f "$arquivo" -o -d "$arquivo" ] || continue

# Se for uma pasta...
if test -d "$arquivo"
then
# Arruma arquivos de dentro dela (-r)
[ "${recursivo:-0}" -eq 1 ] &&
zzarrumanome -r ${pastas:+-d} ${nao:+-n} "$arquivo"/*

# Não renomeia nome da pasta (se não tiver -d)
[ "${pastas:-0}" -ne 1 ] && continue
fi

# A pasta vai ser a corrente ou o 'dirname' do arquivo (se tiver)
caminho='.'
zztool grep_var / "$arquivo" && caminho="${arquivo%/*}"

# $antigo é o arquivo sem path (basename)
antigo="${arquivo##*/}"

# $novo é o nome arrumado com a magia negra no Sed
novo=$(
echo "$antigo" |
tr -s '\t ' ' ' | # Squeeze: TABs e espaços viram um espaço
zzminusculas |
sed -e "
# Remove aspas
s/[\"']//g

# Remove espaços do início e do fim
s/^ *//
s/ *$//

# Remove acentos
y/àáâãäåèéêëìíîïòóôõöùúûü/aaaaaaeeeeiiiiooooouuuu/
y/çñß¢Ð£Øø§µÝý¥¹²³/cnbcdloosuyyy123/

# Qualquer caractere estranho vira sublinhado
s/[^a-z0-9._-]/_/g

# Remove sublinhados consecutivos
s/__*/_/g

# Remove sublinhados antes e depois de pontos e hífens
s/_\([.-]\)/\1/g
s/\([.-]\)_/\1/g

# Hífens no início do nome são proibidos
s/^-/_/

# Não permite nomes vazios
s/^$/_/"
)

# Se der problema com a codificação, é o y/// do Sed anterior quem estoura
if [ $? -ne 0 ]
then
echo "Ops. Problemas com a codificação dos caracteres."
echo "O arquivo original foi preservado: $arquivo"
return 1
fi

# Nada mudou, então o nome atual já certo
[ "$antigo" = "$novo" ] && continue

# Se já existir um arquivo/pasta com este nome, vai
# colocando um número no final, até o nome ser único.
if test -e "$caminho/$novo"
then
i=1
while test -e "$caminho/$novo.$i"
do
i=$((i+1))
done
novo="$novo.$i"
fi

# Tudo certo, temos um nome novo e único

# Mostra o que será feito
echo "$nao$arquivo -> $caminho/$novo"

# E faz
[ "$nao" ] || mv -- "$arquivo" "$caminho/$novo"
done
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r668 by aureliojargas on Mar 28, 2012   Diff
lint: removendo espaços inúteis.
r655 by aureliojargas on Mar 23, 2012   Diff
s/Aurélio/Aurelio/ *
r524 by aureliojargas on May 23, 2011   Diff
COMBO: Agora todas as chamadas ao
zztool uso por falha na verificação
dos parâmetros possuem um return 1
depois. Assim outros scripts que usam
as funções podem detectar erros.
All revisions of this file

File info

Size: 3628 bytes, 132 lines
Powered by Google Project Hosting