Ainda sou muito novo em scripts de shell, então tenho certeza de que esse comando está errado. Estou tentando renomear uma pasta de arquivos com os nomes de um arquivo txt. A pré-condição é que os nomes dos arquivos.txt e os arquivos na pasta já estejam organizados para corresponder a primeira linha ao primeiro arquivo no sistema. O que consegui foi:
while read line; do echo -e "$line\n" | for f in *mkv do mv f $1; done < filenames.txt
mas não funcionou. Vocês podem me ajudar a corrigir isso?
Obrigado
Responder1
Se você não possui nenhuma regra algorítmica para renomear os arquivos (ou seja, você realmente precisa de um arquivo como entrada), sugiro
crie um arquivo txt da lista de arquivos que você deseja renomear, por exemplo:
encontrar . -nome "*.mkv" > arquivos.txt
edite este arquivo e adicione o novo nome após o antigo em cada linha, por exemplo
./meuprimeiro.mkv ./meunovoprimeiro.mkv
processe este arquivo:
enquanto lê a linha; faça avaliação mv $linha; concluído <arquivos.txt
Responder2
Estou me inspirando aqui:https://unix.stackexchange.com/a/26604
Parece que você precisa fazer um loop no arquivo e nos arquivos do diretório ao mesmo tempo:
DIR=./thefiledir
while : ; do
read -r oldfile <&3
read -r newfile <&4
if [ -z "$oldfile" -o -z "$newfile" ]; then
break
fi
mv $oldfile $newfile
done 3< <( find $DIR -maxdepth 1 -type f | sort ) 4< filenames.txt
Não sei se você tem o nome do diretório no filenames.txt
arquivo, então você pode colocar um echo
antes da mv
linha para testar se isso fará o que você deseja.
Além disso, posso tentar fazer isso de outra maneira ... Não tenho certeza de como você está gerando o arquivo com os novos nomes, mas como outra resposta sugere, você pode fazer um loop em um arquivo com nomes novos e antigos ou apenas ler os nomes e aplique alguma lógica para criar os novos nomes.