Como renomear / mover todos os arquivos com uma determinada extensão?
Pergunta
Estou aprendendo (esperar) e agora eu vim para uma questão interessante. Eu preciso de um comando para mover / renomear um monte de arquivos com extensão .status. Eu tentei estes:
spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
É claro que isso não funcionou. Eu pesquisei um pouco e encontrei algo sobre glob, mas não parecem funcionar da maneira que eu quero. Se eu faço:
exec /bin/mv [glob *.status] somedir
mv reclama que '1.Estado 2.status 3.status ... etc.' não é um arquivo válido. É como se toda a lista de arquivos é concatenada em uma única cadeia em vez de ser tratada separadamente.
Tentando encontrar mais informações via google me levar a um monte de links quebrados e desatualizados, por isso estou esperando ao lado de resolver este problema, você poderia me apontar para algum bom recurso on-line para tcl / esperam básico e armadilhas comuns.
Atualização:. Apenas as soluções que usam TCL padrão e ferramentas padrão em / bin serão aceitas
Solução
$ ls -1 1.status 2.status rename.tclsh* some_dir/ two words.status $ cat rename.tclsh #!/usr/local/bin/tclsh eval exec /bin/mv [glob *.status] some_dir $ ./rename.tclsh $ ls -1 rename.tclsh* some_dir/ $ ls -1 some_dir/ 1.status 2.status two words.status
Outras dicas
A resposta de Randy é curto e correto, mas usa um exec sem necessidade. A resposta de Joseph é muito robusto, mas um pouco longo.
Para uma resposta curta e idiomática que eu usaria (requer Tcl 8.5):
arquivo renomeação {*} [glob * .status] some_dir
proc move_to_dir {filenames dirname} {
foreach filename $filenames {
file rename $filename [file join $dirname [file tail $filename]]
}
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/
Esta solução funciona com arquivos com nomes que contenham espaços, quando há um monte de arquivos etc:
exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir
Mas ele precisa encontrar e xargs que são na maioria das vezes em / usr / bin, não / bin.
Como medida de segurança ao usar complexo 'encontrar' comandos e potencialmente exclusão de dados eu furar um 'eco' em frente do comando e capturá-lo em um arquivo.
Posso, então, verificar os comandos listados no arquivo antes de usar 'fonte' para executá-lo.
É também uma maneira de lidar com esses arquivos caso extremo ocasionais manualmente.