AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 727287
Accepted
GrumpyLondoner
GrumpyLondoner
Asked: 2022-12-05 10:06:15 +0800 CST2022-12-05 10:06:15 +0800 CST 2022-12-05 10:06:15 +0800 CST

Renomeação de arquivos em massa

  • 772

Eu tenho uma pasta de 38 GB com 800 vídeos mp4 nela, depois de baixá-la novamente, o nome do arquivo não tem espaçamento, todas as palavras são unidas, mas ainda é maiúsculas e minúsculas.

Qual seria a maneira mais eficaz de renomear em massa?

Lembro-me de um 'rename' ou 'autorename' incluído há muito tempo na minha distro, mas parece que não o tenho agora.

rename
  • 4 4 respostas
  • 1624 Views

4 respostas

  • Voted
  1. Best Answer
    Gilles Quenot
    2022-12-05T10:10:58+08:002022-12-05T10:10:58+08:00

    A ferramenta mais conhecida e intuitiva para renomeação em massa é o rename. É muito parecido sedcom esteróides (mas especialmente para renomear). Este é o comando padrão renameno Debian como SO (diferente rpmdas distros baseadas).

    Nomeado frequentemente prenameou perl-rename. É capaz de fazer processamento regex poderoso:

    rename -n 's/<regex>/<replacement>/[modifiers]' ./*.mp4
    

    Se você deseja adicionar espaços entre cada 'palavras' do nome do arquivo mp4:

    rename -n 's/\B[[:upper:]]/ $&/g' ./*.mp4
    # => rename(./FooBarBaz.mp4, ./Foo Bar Baz.mp4)
    

    Remova -naka dry-runquando suas tentativas forem satisfatórias.

    Por exemplo, você ainda pode injetar chamadas na replacementparte, como sprintf "%03d", 9preenchimento de zero com o emodificador.

    Você (Não) Não Aprende Perl em Cinco Minutos

    Conhecer o Perl é um tempo bem gasto. Mas para começar a usar os recursos de economia de tempo do comando renomear, você não precisa ter muito conhecimento de Perl para colher grandes benefícios em poder, simplicidade e tempo.

    Verifique o documento do perl sobre renomear

    Existe outra ferramenta com o mesmo nome usada em algumas distros como um binário. O

    rename --version
    

    deve ficar assim:

    /usr/bin/rename using File::Rename version 1.30, File::Rename::Options version 1.10
    

    Ou

    rename 2>&1 | grep -i perl
        [ -e|-E perlexpr]*|perlexpr [ files ]
    

    Se você não pode instalar pacotes de todo o sistema, há duas maneiras como rootusuário regular (sem):

    • use cpan -i File::Rename(melhor usar homebrew )
    • baixe-o como um script independente.

    ** Isenção de responsabilidade: se você tiver um arquivo com caracteres Unicode UTF8 contíguos, como AaaÃééZzz.mp4a parte Unicode, será ignorado, consulte o comentário de @ Stéphane Chazelas abaixo . Uma solução é usar

    PERL_UNICODE=ASD rename -n 's/\B\p{Lu}/ $&/g' ./*.mp4
    

    Verificar

    perldoc perlrun | less +/PERL_UNICODE
    
    • 10
  2. Marcus Müller
    2022-12-05T10:13:53+08:002022-12-05T10:13:53+08:00

    Não sei qual seria a maneira mais eficiente (acho que você quis dizer eficiente), mas escreveria rapidamente um loop for como:

    for file in *.mp4; do
      newname="$(echo "$file" | sed 's/\(.\)\([A-Z]\)/\1 \2/g')"
      mv "${file}" "${newname}"
    done
    

    Explicação:

      newname="$(echo "$file" | sed 's/\(.\)\([A-Z]\)/\1 \2/g')"
    #        ^-------------------- Assign to  variable "newname" value…
    #         ^------------------- "$()": as output by commannd in parentheses;
    #                              use "" to avoid word splitting
    

    onde

    echo $file | sed 's/\(.\)\([A-Z]\)/\1 \2/g'
    #    ^-------------------------------------- output old file name
    #          ^-------------------------------- pipe to `sed` command
    

    sedé o nome do "editor de fluxo"; ele recebe a entrada, executa um comando e produz a saída. Aqui, o comando é s, como em "pesquisar e substituir".

    s/\(.\)\([A-Z]\)/\1 \2/g
    ^^ ^  ^ ^      ^ ^  ^  ^
    || |^ | | ^^^  | |  |  |
    \------------------------ s: search and replace
     \----------------------- /: Set the search;replace;flags separator to "/"
       || | | \|/  | \  /  |
       \--+------------------ \(…\): a "capture group" (the first one);
        |   |  |   |  ||   |         whatever is matches the content will be
        |   |  |   |  \|   |         available as \1
        \-------------------- .: We match ".", which means *any* character
            |  |   |   |   |  (which precludes this from matching at start of line)
            \------+--------- \(…\): Second capture group, \2
               \------------- [A-Z]: Match any capital letter
                       |   |
                       \----- Replacement: "\1 \2" replace
                           |  "characterbeforecapitalletter""Capitalletter" with
                           |  "characterbeforecapitalletter" "Capitalletter"
                           |
                           \- g: Flag that means "global": Repeat this until
                                 end of line
    
    • 6
  3. Stéphane Chazelas
    2022-12-06T09:13:53+08:002022-12-06T09:13:53+08:00

    Para separar palavras em maiúsculas, como para FooBarBaz.mp4se tornar Foo Bar Baz.mp4, você pode inserir um espaço antes de cada letra maiúscula, exceto quando é o primeiro caractere no nome do arquivo, o que com zsh zmvvocê pode fazer (recursivamente) com:

    $ autoload -Uz zmv
    $ zmv -n '(**/)(?)(*.mp4)' '$1$2${3//(#m)[[:upper:]]/ $MATCH}'
    mv -- FooBarBaz.mp4 'Foo Bar Baz.mp4'
    mv -- OnceUponATime.mp4 'Once Upon A Time.mp4'
    

    (remova o -npara funcionamento a seco, se estiver satisfeito).

    Cuidado, muda Foo-Bar.mp4para Foo- Bar.mp4.

    zmv -n '(**/)(*.mp4)' '$1${2//(#b)([[:alpha:]])([[:upper:]])/$match[1] $match[2]}'
    

    Só inseriria espaços entre uma letra e uma letra maiúscula, mas não funcionaria para OnceUponATimecima, pois o espaço seria inserido entre ne A, mas não entre Ae T, pois o Ajá teria sido consumido pela substituição anterior.

    Como os zsh globs não têm o equivalente aos operadores de aparência do perl, contornar isso é mais difícil. Uma abordagem simples neste caso, porém, é apenas repetir a substituição por um tempo extra:

    $ zmv -n '(**/)(*.mp4)' '$1${${2//(#b)([[:alpha:]])([[:upper:]])/$match[1] $match[2]}//(#b)([[:alpha:]])([[:upper:]])/$match[1] $match[2]}'
    mv -- ABCDEF.mp4 'A B C D E F.mp4'
    mv -- AChristmasCarol.mp4 'A Christmas Carol.mp4'
    mv -- FooBarBaz.mp4 'Foo Bar Baz.mp4'
    mv -- LeSongeD\'UneNuitD\'Été.mp4 'Le Songe D'\''Une Nuit D'\'Été.mp4
    mv -- LifeOfΠ.mp4 'Life Of Π.mp4'
    mv -- OnceUponATime.mp4 'Once Upon A Time.mp4'
    
    • 4
  4. TAR86
    2022-12-06T05:58:08+08:002022-12-06T05:58:08+08:00

    Outras respostas descreveram ferramentas que permitem a alteração com base em regexes e essa é uma boa abordagem. No entanto, essas respostas não abordam um ponto importante (IMHO): capacidade de visualização antes de realmente fazer alterações no disco (que pode ser difícil de reverter).

    Entre no Emacs e seu diredmodo, em particular wdired, documentado no manual . Alguém abriria o diretório que contém os arquivos, alternaria wdired para tornar os nomes dos arquivos editáveis, faria alterações - provavelmente usando a pesquisa e substituição interativa de regex, revisaria as alterações e, finalmente, as comprometeria no disco.

    Estou ciente de que a instalação do Emacs para este caso de uso é uma abordagem pesada, mas gostaria de apontar que ele lida com nomes de arquivos com caracteres difíceis, por exemplo, espaços, trivialmente.

    • 0

relate perguntas

  • Como substituir uma string em todos os nomes de pastas e arquivos [duplicado]

  • Como pode truncar um nome de arquivo após um determinado caractere

  • Remova caracteres de nomes de arquivos recursivamente

  • Krename: como reiniciar a numeração para cada pasta?

  • Renomeie (acrescentar) arquivos CSV em massa com base em um valor dentro

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve