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 / 410257
Accepted
file woes
file woes
Asked: 2017-12-12 10:09:53 +0800 CST2017-12-12 10:09:53 +0800 CST 2017-12-12 10:09:53 +0800 CST

Remova caracteres de nomes de arquivos recursivamente

  • 772

Tenho centenas de diretórios, alguns aninhados em outros diretórios, com dezenas de milhares de arquivos. Os arquivos precisam ter um carimbo de data/hora removido deles.

Um exemplo de nome de arquivo é Letter to Client 27May2016~20160531-162719.pdfe eu gostaria que ele voltasse a serLetter to Client 27May2016.pdf

Outro nome de arquivo de exemplo é ABCDEF~20160531-162719e eu gostaria que ele voltasse a ser ABCDEF. Observe que este arquivo não possui extensão, diferente do exemplo acima.

Eu preciso de um comando que eu possa executar na raiz das pastas afetadas que irão percorrer recursivamente e encontrar/corrigir os nomes dos arquivos.

(Eu uso o Syncthing para sincronizar arquivos e restaurei os arquivos excluídos copiando-os do .stversionsdiretório de volta para onde estavam, mas descobri que o Syncthing acrescenta esse carimbo de data/hora...)

rename
  • 3 3 respostas
  • 5383 Views

3 respostas

  • Voted
  1. Best Answer
    ilkkachu
    2017-12-12T10:15:14+08:002017-12-12T10:15:14+08:00

    renameConheça a ferramenta Perl :

    $ rename -n -v  's/~[^.]+//' *~*
    rename(ABCDEF~20160531-162719, ABCDEF)
    rename(Letter to Client 27May2016~20160531-162719.pdf, Letter to Client 27May2016.pdf)
    

    ( página do manual online , veja também este Q )

    Essa regex diz para corresponder a um til, como muitos caracteres que não são pontos, mas pelo menos um; e para substituir o que corresponder a uma string vazia. Remova o -npara realmente fazer a substituição. Poderíamos mudar o padrão ~[-0-9]+para apenas substituir dígitos e traços.

    Desculpe, você disse "recursivamente", então vamos usar find:

    $ find -type f -name "*~*" -execdir  rename -n -v  's/~[-0-9]+//' {} +
    rename(./ABCDEF~20160531-162719, ./ABCDEF)
    rename(./Letter to Client 27May2016~20160531-162719.pdf, ./Letter to Client 27May2016.pdf)
    

    Ou apenas com Bash ou ksh, embora os diretórios ~seguidos por dígitos quebrem isso:

    $ shopt -s extglob       # not needed in ksh (as far as I can tell)
    $ shopt -s globstar      # 'set -o globstar' in ksh
    $ for f in **/*~* ; do 
        g=${f//~+([-0-9])/}; 
        echo mv -- "$f" "$g" 
      done
    mv -- ABCDEF~20160531-162719 ABCDEF
    mv -- Letter to Client 27May2016~20160531-162719.pdf Letter to Client 27May2016.pdf
    

    Novamente, remova o echopara realmente fazer a renomeação.

    • 5
  2. Jeff Schaller
    2017-12-12T10:27:11+08:002017-12-12T10:27:11+08:00

    Em bash:

    shopt -s globstar
    for file in **/*~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]*
    do
      echo mv -- "$file" "${file/~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]/}"
    done
    

    Isso localiza todos os nomes de arquivo (recursivamente) que correspondem ao padrão de data (seguindo um til) e, em seguida, repete um mvcomando de amostra para renomeá-los. O destino do comando mv é o resultado de uma expansão de parâmetro bash que substitui qualquer texto til-datestring por nada.

    • 3
  3. Praveen Kumar BS
    2017-12-12T17:57:27+08:002017-12-12T17:57:27+08:00

    Código:

    echo "ABCDEF~20160531-162719" | sed "s/~.*//g"
    echo "Letter to Client 27May2016~20160531-162719.pdf" |sed "s/~.*[^.pdf]//g"
    

    Os comandos acima alcançam o resultado mencionado

    • -1

relate perguntas

  • 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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

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

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +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
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +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