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.csv
este 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 $2
seria 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!
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: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 comsed
, 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;
:A combinação dos dois comandos fornece o que você realmente deseja executar:
Depois de ter certeza de que essa é a saída correta, remova o
echo
e execute novamente para renomear os arquivos:O
--
está lá para proteger contra nomes de arquivo que começam com-
. Veja O que significa "--" em comandos de terminal? .