Como renomeio facilmente vários arquivos usando a linha de comando?

103

Uma das maneiras pelas quais renomeio rapidamente os arquivos no Windows é

F2 > Rename > Tab (to next file) > Rename ...

Mas no Ubuntu / Nautilus, não consigo tabular para o próximo arquivo. Mas estando no Linux, acho que deve haver uma alternativa de linha de comando.

No entanto, às vezes, talvez eu queira ter mais controle sobre como renomear arquivos específicos. Nesse caso, talvez seja melhor poder tabular para o próximo arquivo

Jiew Meng
fonte
1
Você poderia definir "mais controle"? Não sei o que você está pedindo exatamente ..
Dang Khoa
Eu acho que esta pergunta não foi respondida. O que você está pedindo (F2 e depois pula no modo F2 para o próximo arquivo) não está disponível no momento, acho que no Nautilus.
don.joey

Respostas:

189

Eu uso renameo tempo todo. É bem simples, mas espero que você saiba o regex básico:

rename "s/SEARCH/REPLACE/g"  *

Isto irá substituir a cadeia SEARCHcom REPLACEem cada arquivo (ou seja, *). O /gmeio global, então, se você tivesse um SEARCH_SEARCH.jpg, ele seria renomeado REPLACE_REPLACE.jpg. Se você não tivesse /g, teria feito a substituição apenas uma vez e, portanto, agora nomeado REPLACE_SEARCH.jpg. Se você quiser fazer distinção entre maiúsculas e minúsculas, adicione /i(isso seria /giou /igno final).

Com expressões regulares, você pode fazer muito mais.

Observe que este renameé o comando prename(também conhecido como Perl rename), que suporta expressões regulares completas do Perl. Há outro renameque usa padrões e não é tão poderoso. prenamecostumava ser instalado por padrão no Ubuntu (junto com o Perl), mas agora você pode ter que fazer:

sudo apt install rename

Aqui estão alguns exemplos:

Prefixo

Adicionar :

rename 's/^/MyPrefix_/' * 
  • document.pdf renomeado para MyPrefix_document.pdf

Remover :

Além disso, você pode remover seqüências indesejadas. Digamos que você tenha 20 arquivos MP3 com o nome like CD RIP 01 Song.mp3e que queira remover a parte "CD RIP", e que deseja removê-los de todos eles com um único comando.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 para 01 Song.mp3

Observe o espaço extra '^CD RIP ', sem o espaço em que todos os arquivos teriam um espaço como o primeiro caractere do arquivo. Observe também que isso funcionará sem o ^caractere, mas corresponderá CD RIP em qualquer parte do nome do arquivo. As ^garantias de que apenas os caracteres serão removidos se forem o início do arquivo.

Sufixo

Adicionar :

rename 's/$/_MySuffix/' *
  • document.pdf renomeado para document.pdf_MySuffix

Alterar :

rename 's/\.pdf$/.doc/' *

vai mudar Something.pdfpara Something.doc. (A razão para a barra invertida é, .é um caractere curinga no regexp tão .pdfpartidas qPDFenquanto \.pdfúnica corresponde a seqüência exata .pdf. Também é muito importante notar, se você não estiver familiarizado com o bash, você deve colocar barras invertidas entre aspas simples! Você não pode omitir citações ou use aspas duplas, ou o bash tentará convertê-las. Para bash \. e "\." iguais .. (Mas aspas duplas e barras invertidas são usadas, por exemplo "\ n" para uma nova linha, mas como "\."não é uma sequência de escape posterior válida, ela traduz em .)

Na verdade, você pode até colocar as partes da string entre aspas, em vez do todo: 's/Search/Replace/g'é o mesmo que s/'Search'/'Replace'/ge s/Search/Replace/gpara BASH. Você só precisa ter cuidado com caracteres especiais (e espaços).


Sugiro usar a -nopção quando você não estiver certo de ter as expressões regulares corretas. Ele mostra o que seria renomeado e sai sem fazer isso. Por exemplo:

rename -n s/'One'/'Two'/g *

Isso listará todas as alterações que ele teria feito se você não tivesse colocado a -nbandeira lá. Se parecer bom, pressione Uppara voltar e apague -ne pressione Enter(ou substitua-o por -vpara exibir todas as alterações que fizer).

Nota : As versões do Ubuntu acima do 17.04 não são fornecidas renamepor padrão, no entanto, ainda estão disponíveis nos repositórios. Use sudo apt install renamepara instalá-lo

Matt
fonte
Como terei um sufixo "dinâmico". Como 001 - 010 etc. Possível?
Jiew Meng 27/08
Hmm .. Tentei escrever algo, mas não funcionou. Principalmente porque, quando eu adiciono 1 a 001, ele adiciona a 2, e não a 002. Caso contrário, eu poderia usar varaibles para manter a posição numérica e anexá-la. Além disso, acabei de me lembrar, antes que eu sabia sobre o renamecommmand, este é o que eu fiz para acrescentar:for f in *; do mv -v "$f" "prependThis$f"; done
Matt
2
@jiewmeng Sim. Use (?:\.[0-9]{3})$no seu padrão, ele corresponderá a todas as extensões de arquivo de 3 dígitos em um grupo passivo. Exemplo: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Dê uma olhada nesta planilha de regex .
Sergio91pt
@ sergio91pt é uma boa folha de dicas para regex. Mas o que é isso? Deve ser perl - mas não é possível encontrar essa nota lá.
Adobe
@ Adobe É geral para o "regex baseado em perl". Observe a nota sobre o sinal + e a coluna sobre Classes de caracteres POSIX.
Sergio91pt
21

Tente pirenaamer .

Não está integrado ao nautilus, mas faz o trabalho. Aqui está uma revisão.

Thunar (parte do XFCE) também possui um renomeador que você pode executar separadamente.

Renamer em massa de Thunar

RolandiXor
fonte
2
obrigado por mencionar a funcionalidade Thunar. Se você tiver o Thunar - selecione os arquivos na pasta e pressione F2.
Max
9

Parece haver um projeto na barra de ativação chamado nautilus-renamer . Você pode instalá-lo executando make installdepois de baixar o script e descompactá-lo. Parece ter algumas funcionalidades ou, se você conhece alguma programação, pode aprimorá-la conforme sua necessidade, pois é apenas um script python.

insira a descrição da imagem aqui

sagarchalise
fonte
8

Na linha de comando, para renomear um único arquivo, o comando é simplesmente

mv file1.txt file2.txt

Se você quiser fazer isso em lote, provavelmente fará isso por meio de um script. Se você fornecer mais detalhes, eu ou outra pessoa provavelmente poderemos preparar um para você. Dito isto, um script para anexar itens a um arquivo pode ser assim:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

Dependendo exatamente de como você precisa das coisas renomeadas, isso provavelmente será alterado, por exemplo, se você tiver regras de renomeação específicas a seguir. (Pessoalmente, eu faria isso por meio de um script Perl, já que meu bash-foo não é tão bom, mas sou apenas eu.)

Observe que eu consegui a separação do nome do arquivo e da extensão de uma pergunta anterior .

Dang Khoa
fonte
7

Caso deseje fazê-lo sem linha de comando, semelhante ao que você vem fazendo no Windows, use a tecla de seta para a direita em vez da tecla tab . Isso selecionará o próximo arquivo, assim como a guia no Windows.

Rafał Cieślak
fonte
Não é o mesmo: você ainda precisaria ENTER para concluir a renomeação, tecla de seta para ir para o próximo arquivo e F2 para renomeá-lo. O TAB faz isso em uma etapa depois que você renomeia um arquivo.
MestreLion
@MestreLion Mas é muito semelhante ao algoritmo descrito na pergunta e não requer software adicional nem operações de linha de comando. É fácil de usar.
Rafał Cieślak 30/08/11
É verdade que você foi a única resposta que pelo menos tentou a mesma abordagem que a pergunta original. E a triste verdade é que o Nautilus não tem essa funcionalidade. Você pode F2 para renomear, mas é isso. Não há TAB para ir automaticamente para o próximo arquivo no modo de renomeação.
MestreLion 31/08
7

Não é realmente a mesma pergunta de como pode renomear muitos arquivos de uma só vez? mas vou sugerir o mesmo programa que sugeri nessa resposta: qmv .

O qmv é uma ferramenta útil do pacote renameutils. Ele permite que você use seu editor de texto favorito para renomear arquivos. Combinado com o poder do vim, você tem um excelente utilitário de renomeação.

Eu costumo invocá-lo como qmv -f dono diretório em que quero renomear um monte de arquivos. Ou se eu quiser renomear recursivamente qmv -R -f do.

Sempre que preciso renomear vários arquivos, sempre recorro ao qmv (e vim).

http://www.nongnu.org/renameutils/

dempa
fonte
Eu apenas tentei isso com base na sua sugestão. Esta é realmente a ferramenta mais incrível se você usar o vim!
ste_kwr
3

Se a única opção adequada é renomear os arquivos manualmente, uma ótima maneira de fazer isso é usando vidir(no moreutilspacote):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Exemplos


Renomeando arquivos seletivamente

Conteúdo atual do diretório de trabalho:

.
├── bar
├── baz
└── foo

Execute vidir, renomeie os nomes de arquivos nas linhas que contêm os nomes de arquivos que você deseja renomear; pressione CTRL+ Oe CTRL+ X:

screenshot3

.
├── bar.bak
├── baz.old
└── foo.new

Alternando nomes de arquivos seletivamente

Conteúdo atual do diretório de trabalho:

.
├── bar
├── baz
└── foo

Conteúdo atual dos arquivos do diretório de trabalho:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Corra vidir, troque os números nas linhas que contêm os nomes de arquivos que você deseja alternar; pressione CTRL+ Oe CTRL+ X:

screenshot4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Removendo arquivos seletivamente

Conteúdo atual do diretório de trabalho:

.
├── bar
├── baz
└── foo

Execute vidir, remova as linhas que contêm os arquivos que você deseja excluir; pressione CTRL+ Oe CTRL+ X:

screenshot2

.
└── baz
kos
fonte
2

Estou usando o krename. É um aplicativo GUI. Poderia ler tags mp3 e assim por diante.

Ele existe como um aplicativo separado e também como parte do Krusader.

Há também um renamescript - que faz parte da instalação padrão do perl (você provavelmente o instalou). Confira com man rename.

Adobe
fonte