Não está completamente claro para mim, mas qual é a diferença entre mv
e rename
(de util-linux-ng 2.17.2
as /usr/bin/rename
)? Há vantagens de um sobre o outro além de rename
aceitar expressões regulares e mv
não? Eu acredito rename
que também pode lidar com vários renomeamentos de arquivos de uma só vez, enquanto mv
que não faz isso.
Não consegui encontrar uma indicação clara em suas man
páginas, o que mais os diferencia ou através de alguma investigação por conta própria.
type -a rename
erename --version
?rename is /usr/bin/rename
e,rename (util-linux-ng 2.17.2)
respectivamente.rename
significados diferentes em diferentes distros.Respostas:
É basicamente o que diz na tampa, para ambos.
mv
é um utilitário padrão para mover um ou mais arquivos para um determinado destino. Pode ser usado para renomear um arquivo, se houver apenas um arquivo para mover. Se houver vários,mv
só funcionará se o destino for o diretório e moverá os arquivos para lá.Então
mv foo bar
, moverá o arquivofoo
para o diretóriobar
(se existir) ou renomeiefoo
parabar
(sebar
não existir ou não for um diretório).mv foo1 foo2 bar
apenas moverá os dois arquivos para o diretóriobar
ou reclamará sebar
não for um diretório.mv
chamará arename()
função de biblioteca C para mover os arquivos e, se isso não funcionar (eles estão sendo movidos para outro sistema de arquivos), ele copiará os arquivos e removerá os originais.Se tudo o que você tem é
mv
e deseja renomear vários arquivos, será necessário usar um loop de shell. Há uma série de perguntas sobre isso aqui no site, veja por exemplo este , este , e outros .Por outro lado, os vários
rename
utilitários renomeiam os arquivos individualmente.O
rename
from util-linux que você menciona faz uma simples substituição de string, por exemplorename foo bar *
, mudariafoobar
parabarbar
easdffoo
paraasdfbar
. Ele não , no entanto, ter uma expressão regular!O utilitário de renomeação do Perl ( ou várias instâncias dele ) usa uma expressão Perl para transformar os nomes dos arquivos. Provavelmente, usaremos um comando, em que o padrão é uma expressão regular.
s/pattern/replacement/
Tanto a renomeação do util-linux quanto a renomeação do Perl podem ser usadas para mover arquivos para outro diretório ao mesmo tempo, fazendo as alterações apropriadas no nome do arquivo, mas é um pouco estranho. Além de chamar
rename()
os arquivos, a mudança de um sistema de arquivos para outro não funciona.Quanto ao que
rename
você possui, isso pode depender da sua distribuição e / ou do que você instalou. A maioria deles suportarename --version
, então use isso para identificar qual deles você possui.fonte
rename '$_=lc' *
nomes de arquivos em minúsculas. Mas acho que o caso mais comum é usars///
(que mencionei) e a parte do padrão é uma regex; Eu não acho que você pode usar uma função lá. Você poderia fazê-lo na peça de substituição, no entanto.rename.ul
é e será para a versão util-linux, e não para nenhuma outra.man rename
por isso seria bom saber o seu entendimento do exemplo debianrename foo foo0 foo?; rename foo foo0 foo??
exemplo, já que essa foi a única diferença entre as duas páginas de manual que vi. Esse par de comandos funciona porque o primeiro adiciona zero aos nomes de cada nome de arquivo de um dígito e, depois disso, o segundo adiciona (outro) zero a cada nome de arquivo de dois dígitos. Esse segundo conjunto inclui os arquivos renomeados pelo primeiro comando. Usandorename foo foo00 foo?
como o primeiro comando também funciona, ele apenas adiciona dois zeros de uma só vez.mv
simplesmente altera o nome do arquivo (também pode movê-lo para outro sistema de arquivos ou caminho). Você atribui um nome antigo e um novo nome e altera o arquivo para o novo nome ou local.rename
é usado para fazer alterações de nomeação em massa. Digamos que você tinha mil arquivos,foo000.log
através defoo999.log
e você queria mudá-los parabar000.log
Atravésbar999.log
. Commv
você teria que fazermv foo000.log bar000.log
,mv foo001 bar001.log
etc., ou então escrever um script. Comrename
você simplesmente fazrename foo bar foo*.log
, e pronto, milhares de arquivos são alterados em um instante! Muito legal. Confira aman rename
página novamente para obter detalhes.fonte
mv
É uma linha de comando básica projetada para fazer uma coisa e fazer bem (filosofia Unix): mover arquivo (s) ou diretório (s) .
Você pode hackear
STDOUT
&STDIN
¹ para modificar rapidamente a string de destino, mas não é apenas um hack inteligenterenomear (o de Perl)
Existem outras ferramentas com o mesmo nome que podem ou não conseguir fazer isso, portanto, tenha cuidado.
Quando as pessoas falam
rename
, pensamos neste, não noELF
, menos poderoso (mágica?).Não é básico, é Perl. Você pode passar algumas funções do Perl por dentro, e é extremamente poderoso.
Considere este exemplo:
Você deseja renomear um monte de arquivos como
Você pode acrescentar zeros aos dígitos da
sprintf()
seguinte forma (usando regex, heh, é Perl: D):Agora você tem :
Não é realmente um comando básico, não é?
renomear não é realmente projetado para mover dir (s) , mas pode fazê-lo:
O arquivo movido
¹ algum código que vemos nos
*.stackexchange.*
sitesNão é o caminho a seguir , é simplesmente um buggy, apenas para explicar por que usar a ferramenta certa no momento certo
fonte
sprintf
ing com renomeaçãomv move ou renomeia arquivos e diretórios e fará o backup deles; renomear apenas renomeia arquivos.
O mv tem mais recursos e opções. Veja os comutadores nas páginas de manual de cada um para ver as diferenças de recursos. Vamos dar uma olhada usando man no Ubuntu 18.04LTS (sua milhagem pode variar dependendo da versão de cada pacote):
opções mv (omitindo ajuda e versão)
renomear opções (omitindo ajuda e versão)
fonte