Respostas:
Um simples liner deve fazer (assume o sh
shell compatível com Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Explicação:
for ... in ...; do ...; done
é um loop
*:*
corresponde a todos os arquivos e diretórios no diretório atual que possuem :
seu nome
f
é atribuído, por sua vez, a cada um desses nomes de arquivo no loop
mv
renomeia seu primeiro argumento para o segundo; -v
(detalhado) pede que imprima o que faz; essa opção é específica do GNU-utils , portanto está disponível no Linux, mas não no Solaris
echo
imprime seu argumento na saída padrão
tr
lê a saída padrão e converte os caracteres de acordo com o mapa fornecido
Se você estiver usando o bash , poderá evitar gerar um shell extra ( $()
) com subprocessos ( tr
) substituindo $(...)
por ${f//:/-}
.
Conforme declarado em outro post por mim, a rename
ferramenta pode fazer o truque para você. Você só precisa digitar
rename s/:/-/ <files to rename>
Isso substitui todos os dois pontos por um traço em todos os arquivos que você nomear no final, ou seja,2013-10-*
Aqui está o link para o meu outro Post
Tenho certeza que um profissional UNIX poderia fazer isso com o bash, mas aqui está minha versão rápida e suja com o ruby.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
defina path_to_files como o caminho para seus arquivos com nomes incorretos. salve o código acima em um arquivo chamado rename.rb e:
username@machinename$ ruby rename.rb
Se você tiver apenas um ou alguns arquivos, poderá renomear para você:
p="201*"
.old_name=$(ls | grep $p)
.Armazene o novo nome de arquivo com as substituições de caracteres necessárias:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Limpeza de bônus :
a. Se, por uma questão de uniformidade, você deseja substituir os traços (-
) pelos dois pontos (:
) por sublinhados (_
), você pode fazer o seguinte:
new_name=$(ls | grep $p | tr ':-' '_');
b. Se você quiser que o último sublinhado (logo antes do .txt
) seja eliminado, defina a new_name
variável como:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mv
falhará se algum dos nomes de arquivo na operação de renomeação spaces
estiver nele. Nesse caso, coloque as variáveis apropriadas entre aspas, como: mv "$old_name" $new_name
OR mv $old_name "$new_name"
OR mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
Isso pode ser um exagero, mas você pode renomear qualquer caractere especial com o script no link fornecido nesta resposta:
for f in
loop ... é um loop que itera sobre todos os arquivos no diretório atual em que os arquivos precisam corresponder*:*
. (O que acontece com os dirs que correspondem?). O comando move é um movimento oldname newname em que o novo nome é gerado executando um shell com$( subshell here )
. O que tr faz, ...