Em geral, rename
renomeia os nomes de arquivos fornecido de acordo com a regra especificada como o primeiro argumento do comando. Os nomes de arquivos são fornecidos pelos argumentos que seguem o primeiro.
O primeiro argumento no comando de exemplo ( rename 's/\.htm/\.html/' *.htm
) tem partes de pele, onde, neste caso, /
é um delimitador dessas partes:
s/regexp/replacement/[flags]
-
O comando
s
significa substituto:s/<old>/<new>/
. Combine a expressão regular com o conteúdo do espaço de padrão. Se encontrado, substitua a string correspondente pela substituição. -
Expressão regular que corresponde às strings que devem ser substituídas. No caso atual, esta é apenas a string
.htm
.Na maioria das expressões regulares, o ponto
.
corresponde a todos os caracteres. Neste caso, queremos usar o ponto literalmente, então precisamos escapar do seu significado especial usando a barra invertida\
(citando um único caractere). -
Substituição do sting / regexp correspondido a 2.
-
Sinalizador que não é apresentado no exemplo atual. Pode ser, por exemplo, o sinalizador
g
- aplicar a substituição a todas as correspondências ao regexp, não apenas ao primeiro. Vamos supor que temos um arquivo chamadomy.htm-file.htm
:-
O comando original
rename 's/\.htm/\.html/' *.htm
renomeará o arquivo desta forma:my.html-file.htm
. Veja na parte inferior da resposta como evitar esse problema. -
Ao adicionar o
g
flag -rename 's/\.htm/\.html/g' *.htm
- o novo nome do arquivo será:my.html-file.html
.
-
De acordo com os nomes dos arquivos: *
pode representar qualquer número de caracteres (incluindo zero, em outras palavras, zero ou mais caracteres). O shell expandirá esse glob e passará os nomes de arquivos correspondentes como argumentos separados para rename
So *.htm
- corresponderá a todos os nomes de arquivos no caminho atual que terminam com a string .htm
. Por exemplo, se você tiver 1.htm
, 2.htm
, 3.htm
, 4.htm
e 5.htm
, então rename 's/\.htm/\.html/' *.htm
transmitirá exatamente os mesmos argumentos para renomear a execução:
rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm
O comando inteiro ( rename 's/\.htm/\.html/' *.htm
) pode ser lido desta maneira:
rename '<substitute>/<the string ".htm">/<with the string ".html">/' <do it for all files in the current path that end with ".htm">
Vamos voltar ao exemplo quando tivermos um arquivo chamado my.htm-file.htm
. Provavelmente, queremos alterar a última parte do nome do arquivo chamado de extensão após o último ponto. Para este propósito, devemos modificar o comando rename
desta maneira:
rename 's/\.htm$/\.html/' *.htm
Onde o sinal $
corresponde ao final da linha e significa literalmente "ler para trás".
^
- Corresponde à cadeia nula no início do espaço padrão, ou seja, o que aparece após o acento circunflexo deve aparecer no início do espaço padrão. ( leia mais )
^
atua como um caractere especial apenas no início do período normal expressão ou subexpressão (ou seja, após\(
ou\|
). Portátil scripts devem evitar^
no início de uma subexpressão, embora, POSIX permite implementações que tratam^
como um caractere comum em nesse contexto.
$
- É o mesmo que^
, mas refere-se ao final do espaço de padrão.$
também age como um caracter especial apenas no final da expressão regular ou subexpressão (ou seja, antes de\)
ou\|
) e seu uso no final de uma subexpressão não é portável.
Referências:
- Guia do Bash para iniciantes: expansão da Shell
- Resumo das ferramentas de linha de comando GNU / Linux: curingas
- perlre - expressões regulares Perl
- GNU: sed, um editor de fluxo
- Testadores de expressões regulares online