Conheça a força motriz da renomeação de arquivos do mundo Linux e dê mv
– e a você – um descanso. Rename
é flexível, rápido e às vezes até mais fácil. Aqui está um tutorial para esta potência de um comando.
Índice
O que há de errado com o mv?
Não há nada de errado com mv
. O comando faz um bom trabalho e é encontrado em todas as distribuições do Linux, no macOS e em outros sistemas operacionais do tipo Unix. Portanto, está sempre disponível. Mas às vezes você só precisa de uma escavadeira, não de uma pá.
O mv
comando tem um propósito na vida, que é mover arquivos. É um efeito colateral feliz poder ser usado para mover um arquivo existente para um novo arquivo, com um novo nome. O efeito líquido é renomear o arquivo, para que possamos obter o que queremos. Mas mv
não é uma ferramenta dedicada de renomeação de arquivos.
Renomeando um único arquivo com mv
Para usar mv
para renomear um tipo de arquivo mv
, um espaço, o nome do arquivo, um espaço e o novo nome que você deseja que o arquivo tenha. Em seguida, pressione Enter.
Você pode usar ls
para verificar se o arquivo foi renomeado.
mv oldfile.txt newfile.txt
ls * .txt
Renomeando vários arquivos com mv
As coisas ficam mais complicadas quando você deseja renomear vários arquivos. mv
não tem capacidade para renomear vários arquivos. Você deve recorrer ao uso de alguns truques bacanas do Bash. Isso é bom se você conhece algum fu de linha de comando de nível médio, mas a complexidade de renomear vários arquivos com mv
está em total contraste com a facilidade de usar mv
para renomear um único arquivo.
As coisas aumentam rapidamente.
Digamos que temos um diretório com uma variedade de arquivos, de tipos diferentes. Alguns desses arquivos têm uma extensão “.prog”. Queremos renomeá-los na linha de comando para que tenham uma extensão “.prg”.
Como vamos lutar mv
para fazer isso por nós? Vamos dar uma olhada nos arquivos.
ls * .prog -l
Esta é uma maneira de fazer isso sem recorrer à gravação de um arquivo de script Bash real.
para f em * .prog; do mv - "$ f" "$ {f% .prog} .prg"
Isso funcionou? Vamos verificar os arquivos e ver.
ls * .pr *
Então, sim, funcionou. Eles são todos arquivos “.prg” agora, e não há arquivos “.prog” no diretório.
O que acabou de acontecer?
O que esse comando longo realmente fez? Vamos decompô-lo.
para f em * .prog; do mv - "$ f" "$ {f% .prog} .prg"
A primeira parte inicia um loop que irá processar cada arquivo “.prog” do diretório, por sua vez.
A próxima parte diz que o processamento vai fazer . Ele está usando mv
para mover cada arquivo para um novo arquivo. O novo arquivo será nomeado com o nome do arquivo original, excluindo a parte “.prog”. Uma nova extensão de “.prg” será usada em seu lugar.
Tem que haver uma maneira mais simples
Definitivamente. É o rename
comando.
rename
não faz parte de uma distribuição padrão do Linux, portanto, você precisará instalá-lo. Ele também tem um nome diferente em diferentes famílias de Linux, mas todos funcionam da mesma maneira. Você apenas terá que substituir o nome do comando apropriado de acordo com o tipo de Linux que está usando.
em distribuições derivadas do Ubuntu e Debian, você instala rename
assim:
sudo apt-get install renomear
Em distribuições derivadas do Fedora e RedHat, você instala prename
assim. Observe o “p” inicial, que significa Perl.
sudo dnf install prename
Para instalá-lo no Manjaro Linux, use o seguinte comando. Observe que o comando de renomeação é chamado perl-rename
.
sudo pacman -Syu perl-renomear
Vamos fazer isso de novo
E desta vez usaremos rename
. Vamos voltar no tempo para que tenhamos um conjunto de arquivos “.prog”.
ls * .prog
Agora vamos usar o seguinte comando para renomeá-los. Em seguida, verificaremos ls
se funcionou. Lembre-se de substituir rename
pelo nome de comando apropriado para o seu Linux se você não estiver usando o Ubuntu ou um Linux derivado do Debian.
renomear 's / .prog / .prg /' * .prog
ls * .pr *
Funcionou, agora todos eles são arquivos “.prg” e não há arquivos “.prog” restantes no diretório.
O que aconteceu neste tempo?
Vamos explicar esse pedaço de magia em três partes.
A primeira parte é o nome do comando, rename
(ou prename
ou perl-rename
, para as outras distribuições).
A última parte é *.prog
, que diz rename
para operar em todos os arquivos “.prog”.
A parte do meio define o trabalho que queremos fazer em cada nome de arquivo. O s
substituto de meios. O primeiro termo ( .prog
) é o que rename
será pesquisado em cada nome de arquivo e o segundo termo ( .prg
) é o que ele será substituído.
A parte do meio do comando, ou expressão central, é uma ‘ expressão regular ‘ Perl e é o que dá ao rename
comando sua flexibilidade.
Alterar outras partes de um nome de arquivo
Mudamos as extensões dos arquivos até agora, vamos corrigir outras partes dos nomes dos arquivos.
No diretório estão vários arquivos de código-fonte C. Todos os nomes de arquivos são prefixados com “slang_”. Podemos verificar isso com ls
.
ls sl * .c
Vamos substituir todas as ocorrências de “slang_” por “sl_”. O formato do comando já é familiar para nós. Estamos apenas mudando o termo de pesquisa, o termo de substituição e o tipo de arquivo.
renomear 's / slang_ / sl_' * .c
Desta vez, estamos procurando por arquivos “.c”, e procurando por “slang_”. Sempre que “slang_” for encontrado em um nome de arquivo, ele é substituído por “sl_”.
Podemos verificar o resultado desse comando repetindo o ls
comando acima com os mesmos parâmetros:
ls sl * .c
Excluindo parte de um nome de arquivo
Podemos remover uma parte de um nome de arquivo substituindo o termo de pesquisa por nada.
ls * .c
renomear 's / sl _ //' * .c
ls * .c
Podemos ver pelo ls
comando que nossos arquivos “.c” são todos prefixados com “sl_”. Vamos nos livrar disso completamente.
O rename
comando segue o mesmo formato de antes. Estaremos procurando por arquivos “.c”. O termo de pesquisa é “sl_”, mas não há termo de substituição. Duas barras invertidas sem nada entre elas não significam nada, uma string vazia.
rename
irá processar cada arquivo “.c” por vez. Ele irá procurar por “sl_” no nome do arquivo. Se for encontrado, não será substituído por nada. Em outras palavras, o termo de pesquisa é excluído.
O segundo uso do ls
comando confirma que o prefixo “sl_” foi removido de todos os arquivos “.c”.
Limitar alterações a partes específicas de nomes de arquivo
Vamos usar ls
para ver os arquivos que têm a string “param” no nome do arquivo. Então vamos usar rename
para substituir essa string pela string “parâmetro”. Usaremos ls
mais uma vez para ver o efeito que o rename
comando teve nesses arquivos.
ls * param *
renomear 's / param / parâmetro' * .c
ls * param *
Quatro arquivos foram encontrados com “param” no nome do arquivo. param.c, param_one.c e param_two.c têm “param” no início de seus nomes. third_param.c tem “param” no final do nome, antes da extensão.
O rename
comando irá pesquisar por “param” em todo o nome do arquivo e substituí-lo por “parâmetro” em todos os casos.
O segundo uso do ls
comando nos mostra que foi exatamente isso o que aconteceu. Se “param” estava no início ou no final do nome do arquivo, ele foi substituído por “parâmetro”.
Podemos usar os metacaracteres do Perl para refinar o comportamento da expressão do meio. Metacaracteres são símbolos que representam posições ou sequências de caracteres. Por exemplo, ^
significa “início de uma string”, $
significa “fim de uma string” e .
significa qualquer caractere único (exceto um caractere de nova linha).
Vamos usar o início do metacharacter de string ( ^
) para restringir nossa pesquisa ao início dos nomes de arquivo.
ls * param * .c
renomear / ^ parâmetro / valor / '* .c
ls * param * .c
valor ls * .c
Os arquivos que renomeamos anteriormente são listados, e podemos ver que a string “parâmetro” está no início de três nomes de arquivo e no final de um dos nomes de arquivo.
Nosso rename
comando usa o (^
metacaractere do início da linha ) antes do termo de pesquisa “parâmetro”. Isso diz rename
para considerar apenas o termo de pesquisa como encontrado se estiver no início do nome do arquivo. A string de pesquisa “parâmetro” será ignorada se estiver em qualquer outro lugar no nome do arquivo.
Verificando com ls
, podemos ver que o nome do arquivo que tinha “parâmetro” no final do nome do arquivo não foi modificado, mas os três nomes de arquivo que tinham “parâmetro” no início de seus nomes tiveram a string de pesquisa substituída pelo termo substituto “valor.”
O poder do rename
está no poder do Perl. Todo o poder do Perl está à sua disposição.
Pesquisando com agrupamentos
rename
tem ainda mais truques na manga. Vamos considerar o caso em que você pode ter arquivos com strings semelhantes em seus nomes. Eles não são exatamente as mesmas strings, então uma simples pesquisa e substituição não funcionará aqui.
Neste exemplo usamos ls
para verificar quais arquivos nós temos que começam com “str”. Existem dois deles, string.c e strangle.c. Podemos renomear as duas strings de uma vez usando uma técnica chamada agrupamento.
A expressão central deste rename
comando irá procurar por strings dentro de nomes de arquivos que tenham a sequência de caracteres “stri” ou “stra” onde essas sequências são imediatamente seguidas por “ng”. Em outras palavras, nosso termo de pesquisa irá procurar por “string” e “strang”. O termo de substituição é “bang”.
ls str * .c
renomear 's / (stri | stra) ng / bang /' * .c
ls ban * .c
Usando ls
uma segunda vez, confirma que string.c se tornou bang.ce strangle.c agora é bangle.c.
Usando traduções com renomear
O rename
comando pode executar ações em nomes de arquivos chamados traduções. Um exemplo simples de tradução seria forçar um conjunto de nomes de arquivo em maiúsculas.
No rename
comando abaixo, observe que não estamos usando um s/
para iniciar a expressão central que estamos usando y/
. Isso indica rename
que não estamos realizando uma substituição; estamos realizando uma tradução.
O a-z
termo é uma expressão Perl que significa todos os caracteres minúsculos na sequência de a a z. Da mesma forma, o A-Z
termo representa todas as letras maiúsculas na sequência de A a Z.
A expressão central neste comando pode ser parafraseada como “se alguma das letras minúsculas de a a z for encontrada no nome do arquivo, substitua-as pelos caracteres correspondentes da sequência de caracteres maiúsculos de A a Z”.
Para forçar os nomes de arquivo de todos os arquivos “.prg” a maiúsculas, use este comando:
renomear ‘y / az / AZ /’ * .prg
ls * .PRG
O ls
comando nos mostra que todos os nomes de arquivos “.prg” agora estão em maiúsculas. Na verdade, para ser estritamente preciso, eles não são mais arquivos “.prg”. Eles são arquivos “.PRG”. O Linux diferencia maiúsculas de minúsculas.
Podemos reverter esse último comando invertendo a posição dos termos a-z
e A-Z
na expressão central.
renomear ‘y / AZ / az /’ * .PRG
ls * .prg
Você (Wo | Do) não aprende Perl em cinco minutos
Conhecer o Perl é um tempo bem gasto. Mas para começar a usar os recursos de economia de tempo do rename
comando, você não precisa ter muito conhecimento de Perl para colher grandes benefícios em poder, simplicidade e tempo.