Isso renomeará arquivos e diretórios (bem, qualquer coisa que corresponda, na verdade). Eu especifiquei -depth
para que os diretórios de nível mais alto não sejam renomeados até que o conteúdo tenha sido processado com segurança.
find . -depth | rename -n -e 'y{*:}{_}; s{(?<=/)\s+(?!.*/.*$)}{}'
A renomeação é construída a partir de duas ERs. (Meu rename
aceita apenas um argumento -e {RE}
, então concatenei as duas operações no parâmetro único.)
O primeiro é simples: y{*:}{_}
substitui *
ou :
por _
(também conhecido como Unix tr
).
O segundo é mais complicado e usa lookbehind e lookahead para combinar o componente necessário. Ele diz que a expressão \s+
a ser processada deve ser imediatamente precedida por /
e não deve ser seguida por /
em qualquer lugar no restante do nome do arquivo.
Saída
rename(./ dkfjd L, ./dkfjd L)
rename(./aaa*, ./aaa_)
rename(./aaa*bbb, ./aaa_bbb)
rename(./ sdf.sdf, ./sdf.sdf)
rename(./aaa:bbb, ./aaa_bbb)