Esta é uma das principais perguntas frequentes sobre a linha de comando do Unix e não consigo encontrá-la neste site, então devemos criar este Wiki da comunidade?
Gilles
5
Eu não vejo o porquê. É uma pergunta específica com uma resposta verificável.
Internet man
3
Se você estiver executando o X, não será muito mais fácil do que thunar -B *.pngpara a ferramenta GUI de renomeação em massa do thunar.
dotjoe
@dotjoe Obrigado, Thunar é realmente interessante.
Volker Siegel
Respostas:
106
Se você estiver usando o Bash ou outro shell compatível com POSIX:
você realmente deve explicar que este é um programa perl que talvez precise ser instalado e que usa expressões regulares como argumento.
Ah, eu não estava ciente disso. Vou dar crédito para a resposta canônica, quando eu identificá-lo :)
homem Internet
5
Este renameprograma veio de uma distribuição de exemplos Perl. Debian e Ubuntu enviam como /usr/bin/rename. Outras variantes do Unix podem não fornecer, ou podem fornecer uma completamente diferente /usr/bin/rename.
Gilles
1
Algumas versões do renametake a de que padrão de substituição:rename [options] <expression> <replacement> <file>...
mescla
1
Se você estiver usando um sistema baseado no Debian, então sudo apt-get install rename, poderá usar o comando rename. É sed para nomes de arquivos.
Ctrl-alt-delor 31/12/16
41
zmv
O shell zsh possui um poderoso comando de renomeação de lote chamado zmv.
Primeiro, você precisa habilitar o zmvcomando da seguinte maneira (isso pode entrar no seu ~/.zshrc).
autoload zmv
A sintaxe básica é zmv PATTERN REPLACEMENT. O padrão é uma expressão glob shell. Partes do padrão podem estar entre parênteses. O texto de substituição pode conter $1, $2, etc, para se referir ao grupo parenthesised Nth no padrão. Por exemplo:
zmv 'image(*.png)''$1'
Você também pode pedir zsh para definir automaticamente $1, $2, etc, para coincidir com os caracteres curinga no padrão:
sweeeeeeeeeeeeeeeeeet. ainda outra razão pela qual eu deveria estar aprendendo zsh.
Ixtmixilix 11/11/19
1
@ixtmixilix o que há para aprender? Comece a usá-lo e, talvez, adicione prezto ( github.com/sorin-ionescu/prezto ) para obter mais detalhes.
Gerry
Muito legal, como apontado no manual do zmv, isso pode ser ainda mais simplificado adicionando o pseudônimo mmv = 'noglob zmv -W' a: mmv * .c.orig orig / *. C
Bretsko
Permitindo zmvprezto requer descomentando a linha em seu ~ / .zpreztorc seguir # Set the Zsh functions to load (man zshcontrib).dandozstyle ':prezto:load' zfunction 'zargs' 'zmv'
33
Normalmente, uso o utilitário mmv ( página de manual ) agradável e simples para este caso de uso:
$ mmv "image*.png""#1.png"
executará sua tarefa.
O #1padrão no destino será substituído pelo que corresponder ao curinga no padrão de origem. Isso também funciona para vários caracteres curinga e pode ser usado, por exemplo, para alterar a ordem das partes dos nomes de arquivos. Você também pode facilmente fazer coisas mais complicadas, como converter letras minúsculas em maiúsculas.
Certifique-se de proteger os padrões do shell, citando.
Obrigado por apontar este utilitário. Encontrei nos repositórios Debian, Ubuntu e Cygwin. Eu tive problemas com a página de manual, mas encontrei algumas páginas da Web e essa pergunta do Stack Overflow que ajudaram a explicar como você a estava usando. stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley
Obrigado, adicionei mais algumas informações à resposta para torná-la mais clara.
Marcel Stimberg
3
Não é possível vomitar o suficiente! É tão simples e amigável. Disponível para OS X em homebrew.
Greg Dubicki
9
POSIX sh para loop
Usa sed para renomear
for i in image*jpg
do
mv -v "$i""$(echo "$i" | sed -e 's/^\.\/image//' - )"done
O comando qmvde renameutilsabre um editor mostrando uma lista de nomes de arquivos com duas colunas, separadas por uma guia. Cada linha mostra um dos nomes de arquivo, o mesmo nas duas colunas. A coluna da direita está representando os novos nomes dos arquivos.
Para fazer alterações, edite os nomes no lado direito. Neste exemplo, :%s/...ou o modo de bloqueio visual é útil.
Tente brename ( https://github.com/shenwei356/brename ), uma ferramenta prática de linha de comando de plataforma cruzada para renomear arquivos / diretórios em lote com segurança por meio de expressão regular (compatível com Windows, Linux e OS X).
O Linux tem uma variedade de opções de renomeação de arquivos em lote, mas eu não vi nenhuma falha no nome que apareceu em mim.
Recursos:
Plataforma cruzada . Suporte para Windows, Mac OS X e Linux.
Seguro . Ao verificar possíveis conflitos e erros .
Filtragem de arquivos . Suporte para inclusão e exclusão de arquivos por meio de expressão regular. Não há necessidade de executar comandos como find ./ -name "*.html" -exec CMD.
Renomeando sub-correspondência com o valor correspondente por meio do arquivo de valores-chave .
Renomear via número crescente ascendente .
Renomear recursivamente arquivos e diretórios .
Suporte a funcionamento a seco .
Saída colorida .
Comando:
$ brename -f .png -p image
[INFO] checking:[ ok ]'image0001.png'->'0001.png'[INFO] checking:[ ok ]'image0002.png'->'0002.png'[INFO] checking:[ ok ]'image0003.png'->'0003.png'[INFO]3 path(s) to be renamed
[INFO] renamed:'image0001.png'->'0001.png'[INFO] renamed:'image0002.png'->'0002.png'[INFO] renamed:'image0003.png'->'0003.png'[INFO]3 path(s) renamed
Algo não está certo: "mv: operando de arquivo de destino ausente após 'image0001.png'" "
Internet man
3
Existem muitos problemas com o seu código. Analisar a saída de lsestá apenas pedindo problemas. readdeveria ser read -r. todas as substituições de variáveis devem estar entre aspas duplas.
Gilles
Você poderia escrever isso de forma mais eficaz como for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done. A análise lsnão é necessária nem é uma boa ideia .
thunar -B *.png
para a ferramenta GUI de renomeação em massa do thunar.Respostas:
Se você estiver usando o Bash ou outro shell compatível com POSIX:
fonte
No Debian e derivativos, o Perl
rename
funciona da mesma formased
:Há também a
rename
deutil-linux
que funciona como este, em vez disso:fonte
rename
programa veio de uma distribuição de exemplos Perl. Debian e Ubuntu enviam como/usr/bin/rename
. Outras variantes do Unix podem não fornecer, ou podem fornecer uma completamente diferente/usr/bin/rename
.rename
take a de que padrão de substituição:rename [options] <expression> <replacement> <file>...
zmv
O shell zsh possui um poderoso comando de renomeação de lote chamado
zmv
.Primeiro, você precisa habilitar o
zmv
comando da seguinte maneira (isso pode entrar no seu~/.zshrc
).A sintaxe básica é
zmv PATTERN REPLACEMENT
. O padrão é uma expressão glob shell. Partes do padrão podem estar entre parênteses. O texto de substituição pode conter$1
,$2
, etc, para se referir ao grupo parenthesised Nth no padrão. Por exemplo:Você também pode pedir zsh para definir automaticamente
$1
,$2
, etc, para coincidir com os caracteres curinga no padrão:fonte
zmv
prezto requer descomentando a linha em seu ~ / .zpreztorc seguir# Set the Zsh functions to load (man zshcontrib).
dandozstyle ':prezto:load' zfunction 'zargs' 'zmv'
Normalmente, uso o utilitário mmv ( página de manual ) agradável e simples para este caso de uso:
executará sua tarefa.
O
#1
padrão no destino será substituído pelo que corresponder ao curinga no padrão de origem. Isso também funciona para vários caracteres curinga e pode ser usado, por exemplo, para alterar a ordem das partes dos nomes de arquivos. Você também pode facilmente fazer coisas mais complicadas, como converter letras minúsculas em maiúsculas.Certifique-se de proteger os padrões do shell, citando.
fonte
POSIX sh para loop
Usa sed para renomear
fonte
Eu gosto do Perl:
Você também pode usar o mesmo padrão para outras tarefas, como copiar os arquivos para outro diretório:
fonte
rename($old,$_)
qmv
O comando
qmv
derenameutils
abre um editor mostrando uma lista de nomes de arquivos com duas colunas, separadas por uma guia. Cada linha mostra um dos nomes de arquivo, o mesmo nas duas colunas. A coluna da direita está representando os novos nomes dos arquivos.Para fazer alterações, edite os nomes no lado direito. Neste exemplo,
:%s/...
ou o modo de bloqueio visual é útil.Nomes de arquivos no seu editor
No editor:
Edite nomes na coluna da direita:
(Removendo o
image
prefixo de todas as linhas usando o modo de bloco visual)Log de renomeação:
(por exemplo Ubuntu:
apt-get install renameutils
)fonte
recursivo
recursão fácil selecionando arquivos de imagem * png e não assume a necessidade de lidar com nova linha nos nomes de arquivo
Seguro, pode lidar com espaços, novas linhas, barras invertidas e qualquer outra coisa :
fonte
POSIX sh usando um loop while
Lendo nomes do
find
comando.Lendo nomes de um arquivo
fonte
Usando expansão de chaves de casca :
fonte
Para Windows e linux , esse script Perl funcionará; nesse caso:
O script pode ser executado recursivamente em diretórios e até mesmo acrescentando uma contagem a todos eles:
Os caracteres UTF-8 também são tratados corretamente, no Windows e no linux.
fonte
Você pode usar esta ferramenta: rnm ( página da web )
Para o seu caso, o comando seria:
Você pode encontrar mais exemplos / documentos aqui .
fonte
Tente brename ( https://github.com/shenwei356/brename ), uma ferramenta prática de linha de comando de plataforma cruzada para renomear arquivos / diretórios em lote com segurança por meio de expressão regular (compatível com Windows, Linux e OS X).
@patrickDurusau disse:
Recursos:
find ./ -name "*.html" -exec CMD
.Comando:
fonte
ls * png | enquanto lê -rf; do f2 = "` echo $ f | sed -e's / imagem // '`"; mv $ f $ f2; feito
fonte
ls
está apenas pedindo problemas.read
deveria serread -r
. todas as substituições de variáveis devem estar entre aspas duplas.for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done
. A análisels
não é necessária nem é uma boa ideia .