Como renomear vários arquivos no bash (não por padrão, mas solicitando cada novo nome)?

1

Eu quero renomear todos os arquivos em um diretório. Os novos nomes não seguem nenhum padrão, por isso não posso usar rename . Existe alguma maneira eficiente de fazer isso, então não precisarei usar mv foo.txt bar.txt para cada arquivo?

    
por n.st 09.05.2013 / 18:22

3 respostas

3

Ao pensar em escrever isso como um script, verifiquei se os nomes possíveis já foram dados e, na verdade, meu palpite "movimento interativo" já está escrito e pronto para uso. Para a maioria dos sistemas, ele deve estar disponível no renameutils-package , que contém várias ferramentas que são muito úteis:

  • qmv / qcp : Mover / Copiar rápido, grava todos os nomes de arquivos em um arquivo de texto que pode ser editado.
  • imv / icp : Mover / Copiar Interativo, pede o novo nome dos arquivos.

O problema com imv / icp neste caso é que eles aceitam apenas um argumento:

imv FILENAME

Vários argumentos geram um erro. Então, basicamente, você precisará envolvê-lo em um curto for loop:

for file in *; do imv "$file"; done

Isso é difícil de digitar, então devemos colocar isso em uma função pronta para usar, que podemos colocar em nosso arquivo .bashrc .

# Mass Interactive Move
function mimv {
    for file in "$*"; do
        imv "$file"
    done
}

Felizmente, imv mostra o nome do arquivo que está sendo processado no momento, portanto, não precisamos de nenhuma instrução echo para sabermos o que está acontecendo.

    
por 10.05.2013 / 08:51
3

Você pode usar este comando:

for i in *; do
   read -p "$i -> " newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

Ele solicitará um novo nome para cada arquivo e também para cada diretório ( for i in * ) no diretório atual. O novo nome é lido em $newname . Se você pressionar Enter sem digitar um novo nome, nada será feito ( -z $newname verifica se $newname está vazio ( z ero); ! é lógico not ), caso contrário, mv é usado para renomear o arquivo.

Se você quiser alterar o nome do arquivo apenas um pouco, é mais eficiente se você puder editá-lo , começando com o antigo nome do arquivo, como sugerido por @grawity:

for i in *; do
   read -p "$i -> " -e -i "$i" newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

Eu testei com nomes de arquivos contendo espaços e chaves, no entanto, por favor, use-o por sua conta e risco (e faça um backup dos arquivos originais antes).

    
por 09.05.2013 / 18:42
-1
#!/usr/bin/env bash

for files in $( echo * );
do
     echo -n Rename $files  to which name? ;
     read new_name ;
     mv "$files" "$new_name";
done
    
por 09.05.2013 / 18:49