Pergunta

tcl

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top