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

95

Uma das formas de renomear arquivos rapidamente 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, posso querer mais controle sobre como renomear arquivos específicos. Nesse caso, talvez seja melhor poder tabular para o próximo arquivo

    
por Jiew Meng 25.08.2011 / 03:18

8 respostas

173

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

rename "s/SEARCH/REPLACE/g"  *

Isso substituirá a string SEARCH por REPLACE em todos os arquivos (ou seja, * ). O /g significa global, portanto, se você tivesse um SEARCH_SEARCH.jpg , ele seria renomeado REPLACE_REPLACE.jpg . Se você não tivesse /g , só teria feito substituição uma vez e, portanto, agora chamado de REPLACE_SEARCH.jpg . Se você não quiser diferenciar maiúsculas de minúsculas, adicione /i (isso seria, /gi ou /ig no final).

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

Observe que esse rename é o comando prename (também conhecido como Perl rename ), que oferece suporte a Expressões regulares Perl. Há outro rename que usa padrões e não é tão poderoso. prename costumava 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ê tivesse 20 arquivos MP3 chamados CD RIP 01 Song.mp3 e você queria remover a parte "CD RIP", e você queria remover isso de todos eles com um comando.

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

Observe o espaço extra em '^CD RIP ' , sem o espaço, todos os arquivos teriam um espaço como o primeiro caractere do arquivo. Observe também que isso funcionará sem o caractere ^ , mas corresponderia a CD RIP  em qualquer parte do nome do arquivo. O ^ garante que apenas remove os caracteres se eles forem o começo do arquivo.

Sufixo

Adicionar :

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

Alterar :

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

mudará Something.pdf para Something.doc . (O motivo da barra invertida é, . é um caractere curinga no regexp, então .pdf corresponde a qPDF , enquanto \.pdf corresponde apenas à sequência exata .pdf . Também é muito importante observar, se você não estiver familiarizado com BASH, você deve colocar barras invertidas em citações SINGLE! Você não pode omitir aspas ou usar aspas duplas, ou o bash tentará traduzi-las.Para bash \. e "\." equals . . ( Mas as aspas duplas e as barras invertidas são usadas, por exemplo, "\ n" para uma nova linha, mas como "\." não é uma seqüência de escape de volta válida, ela se traduz em . )

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

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

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

Isso listará todas as alterações que teria sido feito se você não colocasse o -n flag lá. Se parecer bom, pressione Up para voltar, depois apague o -n e pressione Enter (ou substitua-o por -v para gerar todas as alterações feitas).

    
por Matt 25.08.2011 / 15:45
21

Experimente pyrenamer .

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

Thunar (parte do XFCE) também tem um renamer que você pode rodar separadamente.

    
por RolandiXor 25.08.2011 / 03:37
9

Parece haver um projeto no launchpad chamado nautilus-renamer . Você pode instalá-lo executando make install depois de baixar o script e descompactá-lo. Parece ter algumas funcionalidades ou se você sabe alguma programação pode ser que você poderia apenas melhorar a sua necessidade, pois é apenas um script python.

    
por sagarchalise 25.08.2011 / 09:06
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 desejará fazer isso por meio de um script. Se você fornecer mais detalhes, eu ou outra pessoa provavelmente conseguiremos uma para você. Dito isso, um script para anexar coisas 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 que as coisas renomeadas, isso provavelmente será modificado, por exemplo, se você tiver regras de renomeação específicas a serem seguidas. (Pessoalmente, eu faria isso por meio de um script em Perl, já que meu bash-foo não é tão bom, mas isso é só comigo.)

Note que obtive a separação de nome de arquivo e extensão de uma pergunta feita anteriormente .

    
por Dang Khoa 25.08.2011 / 04:19
7

Caso você deseje fazê-lo sem a linha de comando, da mesma forma que o que vem fazendo no Windows, use tecla de seta para a direita em vez da tecla de tabulação . Isso selecionará o próximo arquivo da mesma forma que a guia no Windows.

    
por Rafał Cieślak 25.08.2011 / 17:13
7

Não é realmente a mesma pergunta que Como pode renomear muitos arquivos de uma vez? mas vou sugerir o mesmo programa que sugeri na 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 do na pasta onde eu quero renomear um monte de arquivos. Ou se eu quiser renomear recursivamente qmv -R -f do .

Sempre que tenho a necessidade de renomear vários arquivos, sempre recorro ao qmv (e ao vim).

link

    
por dempa 30.08.2011 / 22:47
3

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

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 do diretório de trabalho atual:

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

Execute vidir , renomeie os nomes dos arquivos nas linhas que contêm os nomes de arquivos que você deseja renomear; aperte CTRL + O e CTRL + X :

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

Alternando nomes de arquivos seletivamente

Conteúdo do diretório de trabalho atual:

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

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

$ 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

$ 

Execute vidir , mude os números nas linhas que contêm os nomes de arquivos que você deseja alternar; aperte CTRL + O e CTRL + X :

. ├── 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 do diretório de trabalho atual:

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

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

. └── baz     
por kos 10.02.2016 / 11:07
2

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

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

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

    
por Adobe 25.08.2011 / 08:49