Escudo: zsh
Olá pessoal, estou tentando alterar rapidamente a extensão de um arquivo como no DOS.
Eu encontrei esta pergunta sobre isso (mais ou menos) ainda não responde à pergunta: Renomeie vários arquivos com mv para alterar a extensão
Eu quero alterar a extensão de um arquivo em um diretório específico distante do meu pwd
, então quando eu mv
faço não quero redigitar novamente o mesmo diretório, ou seja:
mv /Users/dir/dir1/moredir/long/foo.txt /Users/dir/dir1/moredir/long/foo.yaml
Um n00b como eu simplesmente assumiria que você pode ir /Users/dir/dir1/moredir/long/foo.txt *.yaml, mas esse não é o caso.
Existe alguma maneira simples de conseguir isso?
Desde já agradeço e desejo um ótimo final de semana!
Para um único arquivo, você pode usar a expansão de chaves para construir uma linha de comando para renomear um arquivo, onde apenas uma parte do nome do arquivo é alterada.
A sintaxe geral é , que se expande para antes da execução .
mv UNCHANGED1{OLD,NEW}UNCHANGED2
mv UNCHANGED1OLDUNCHANGED2 UNCHANGED1NEWUNCHANGED2
mv
Para vários arquivos, a função zsh
zmv
fornece maneiras convenientes de mover e renomear arquivos. Coloque isso no seu.zshrc
ou execute-o na linha de comando em cada sessão em que você deseja usarzmv
:Então, para alterar a extensão dos arquivos no diretório atual, você pode executar qualquer um deles. Observe que você precisa de aspas simples em torno dos argumentos, porque o
*
e$
precisa ser interpretado dentrozmv
e não antes de invocarzmv
.Para alterar a extensão de arquivos em outro diretório, sem precisar repetir o caminho do diretório:
No texto de substituição:
$f
é todo o caminho de origem.:r
é um modificador de histórico que remove a extensão do nome do arquivo.$1
é o primeiro grupo entre parênteses no padrão de origem. Grupos entre parênteses não podem conter separadores de diretório (com uma exceção que não se aplica aqui).-w
sinalizador coloca automaticamente cada curinga em um grupo.-W
sinalizador faz com que cada um*
no texto de substituição represente qualquer correspondência*
correspondente no padrão de origem.(Existem várias outras ferramentas para fazer isso, mas elas não fazem parte da instalação padrão na maioria das variantes do Unix, incluindo o macOS. Como você está usando o zsh, aproveite o zmv, que é muito bom em seu trabalho.)
Para renomear o arquivo único
foo.txt
nofoo.yaml
diretório/Users/dir/dir1/moredir/long
, você pode primeiro entrar nesse diretório e depois executarmv
:Ou você pode usar uma expansão de chave que se expande para os nomes de caminho de origem e destino:
O acima se expandiria para o comando completo
... antes que o shell chame
mv
. Obviamente, isso só funcionaria enquanto o arquivo permanecesse no mesmo diretório após ser renomeado.