Para loop para renomear arquivos com prompt para cada nome de arquivo

2

Eu tenho que converter vários arquivos de vídeo em uma pasta. Eu tenho que renomear cada um deles, mas eu preciso do script para solicitar que eu escreva um nome personalizado para cada nome de arquivo. Aqui está o que eu tenho até agora:

  1. Primeiro, preciso remover os espaços de nome de arquivo que meu script faz com esse comando:

    for f in *' '*; do mv "$f" "'echo $f | sed -e 's/ /_/g''"; done
    
  2. Eu removi a extensão dos arquivos porque não preciso dela para a conversão. Eu uso este comando:

    for x in *; do mv $x $(echo ${x%*.*}); done
    

Depois disso, preciso de um loop for para renomear cada arquivo no padrão:

for i in * ; do mv $i $customname; done

O problema é que eu preciso nessa fase do script para me perguntar qual nome adicionar na variável $customname para cada arquivo. Algo parecido com isto:

Rename file1 to:
.......

Rename file2 to:
.......
    
por ispasov 06.09.2013 / 10:24

2 respostas

3

Use apenas read para ler uma linha de STDIN, assim.

for FILE in *; do
    echo "Rename '$FILE' to:"
    read NAME
    mv "$FILE" "$NAME"
done

Este exemplo exige que você pressione Ctrl-C para abortar quando terminar, mas você pode adicionar um caso if extra para abortar. se nenhum nome foi inserido.

EDITAR: Se você quiser que todos os seus arquivos de destino tenham a mesma extensão de arquivo do arquivo original (por exemplo, se o arquivo foi chamado pogo.jpg , você deseja que o arquivo renomeado mantenha o arquivo .jpg ending, e não precisa digitar isso manualmente) você pode alterar o comando mv no loop acima para:

mv "$FILE" "$NAME.${FILE##*.}"

O material ${FILE##*.} na string acima significa:

  • ${FILE...} exibe a variável $FILE , mas…
  • ## remove a cadeia de correspondência mais longa desde o início (apenas um # corresponde ao menor)
  • * corresponde zero ou mais de qualquer caractere
  • . corresponde a um período literal

Somente se a expressão inteira ( *. ) corresponder a ela será removida, assim, se não houver um período no nome do arquivo original, você obterá um resultado estranho e o novo nome do arquivo será NEWNAME.OLDNAME . / p>     

por 06.09.2013 / 10:33
2

Aqui está o que eu usei para o meu USB-PVR antes de escrever um script que obtém os nomes do programa de TV ...

#!/bin/bash

for f in "$@"
do
    echo Playing "$f"...
    mplayer "$f"
    echo That was "$f".
    read -p "New name? " newname

    if [ "$newname" != "" ]
    then
        mv -v -i "$f" PVR-"$newname".mkv
    fi

    sleep 1
done

Uma maneira realmente tediosa de renomear arquivos, se assim posso dizer ...

    
por 06.09.2013 / 11:55