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 / ubuntu / Perguntas / 1534737
Accepted
Wenuda
Wenuda
Asked: 2024-12-05 23:44:41 +0800 CST2024-12-05 23:44:41 +0800 CST 2024-12-05 23:44:41 +0800 CST

Script Bash para renomear arquivos de acordo com uma lista em um arquivo: Como lidar com espaços?

  • 772

Tenho que renomear um grande número de arquivos de acordo com uma lista do Excel (sim, eu sei).

Então minha abordagem foi exportar os nomes dos arquivos do Excel para filenames.csveste formato:

this_is_a_file.ext ; new_filename_1.ext
this_is_another_file.ext ; new_filename_2.ext
this is a filename with spaces.ext ; new_filename_3.ext

Para renomear, quero usar algo como este script bash:

lstrn() {
 while IFS= read -r line; do
    oldfilename=`echo $line | awk '{print $1}'`
    newfilename=`echo $line | awk '{print $3}'`
    mv $oldfilename $newfilename
 done < $1
}

Com o qual eu correria:

$ lstrn filenames.csv

Isso funciona bem, desde que nem o nome do arquivo antigo nem o novo tenham espaços.

Pelo que entendi, o $1é o bloco de texto com o nome do arquivo antigo, o $2seria o ;e o $3é o novo nome do arquivo em cada linha do meu filenames.csv.

Acho que entendi por que isso não funcionaria com espaços nos nomes de arquivo... Preciso substituir a awk '{print $1}'parte, certo?

Estou completamente perdido sobre como fazer isso funcionar com espaços e realmente apreciaria se alguém tivesse uma ideia de como fazer isso!

command-line
  • 1 1 respostas
  • 34 Views

1 respostas

  • Voted
  1. Best Answer
    terdon
    2024-12-06T01:29:17+08:002024-12-06T01:29:17+08:00

    Se pudermos assumir que os nomes dos seus arquivos não contêm ;(essa é uma suposição enorme, ;é perfeitamente válida em nomes de arquivos, então você precisa ter certeza sobre isso), então você pode simplesmente ler seu arquivo de texto de entrada, dividir ;e salvar o resultado em duas variáveis, permitindo que você renomeie:

    while IFS=';' read old new ; do mv "$old" "$new" ; done < filenames.csv
    

    Aqui, definimos o separador de campo de entrada ( IFS) como a ;, então lemos o arquivo de entrada, dividimos ;e atribuímos os nomes de arquivo antigo e novo às suas respectivas variáveis.

    Agora, seu exemplo de entrada também tem espaços ao redor do ;. Isso significa que o nome do arquivo não é "this_is_a_file.ext"mas "this_is_a_file.ext "com um espaço extra, e esse arquivo não existirá. Então, antes de executar o comando acima, você precisa remover esses espaços extras. Você pode fazer isso com sed, dizendo para ele substituir todos os casos de dois ou mais espaços ( *, que é um espaço, depois outro espaço e um *) ao redor de a ;com apenas o ;:

    $ sed 's/  *;  */;/g' filenames.csv 
    this_is_a_file.ext;new_filename_1.ext
    this_is_another_file.ext;new_filename_2.ext
    this is a filename with spaces.ext;new_filename_3.ext
    

    A combinação dos dois comandos fornece o que você realmente deseja executar:

    $ sed 's/  *;  */;/g' filenames.csv |  
       while IFS=';' read old new ; do 
         echo "mv \"$old\" \"$new\"" ; 
    done 
    mv "this_is_a_file.ext" "new_filename_1.ext"
    mv "this_is_another_file.ext" "new_filename_2.ext"
    mv "this is a filename with spaces.ext" "new_filename_3.ext"
    

    Depois de ter certeza de que essa é a saída correta, remova o echoe execute novamente para renomear os arquivos:

    sed 's/  *;  */;/g' filenames.csv |  
       while IFS=';' read old new ; do 
         mv -- "$old" "$new" ; 
    done 
    

    O --está lá para proteger contra nomes de arquivo que começam com -. Veja O que significa "--" em comandos de terminal? .

    • 1

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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