Renomeia todos os arquivos no diretório enquanto preserva qualquer extensão de arquivo

2

Eu tenho pasta com cerca de 1200 arquivos que eu preciso renomear. A extensão do arquivo é .jpg, .gif e .png na maior parte.

Aqui estão alguns exemplos:

    Awesome\ FB\ \ (462).jpg   
    Bonus\ FB\ Cover\ Pics\ (80).jpg
    Awesome\ FB\ \ (463).jpg   
    Bonus\ FB\ Cover\ Pics\ (81).jpg
    Awesome\ FB\ \ (464).jpg   
    Bonus\ FB\ Cover\ Pics\ (82).jpg
    Awesome\ FB\ \ (465).jpg   
    Bonus\ FB\ Cover\ Pics\ (83).jpg

Eu tentei:

    rename 's/\.{???} $/-img4sm.{???}/' ./*.{???}

Eu também tentei isso, mas apenas colocando um .jpg ou .gif em vez de {???}, e substituindo o {} por [].

Eu também tentei:

    find . -type f -iname '*.???' -exec rename 's/\.{???} $/-img4sm.{???}/' ./*.{} +

Consegui usar este comando sem mensagens de erro no CloudLinux (CentOS), mas nenhum nome de arquivo foi alterado.

Por favor me ajude. Obrigado!

    
por technerdius 20.10.2015 / 09:11

3 respostas

0

Aqui está uma solução usando o php com base em esta resposta . Crie um arquivo, por exemplo, myrename.php com o seguinte conteúdo:

<?php
$test = 1;
if(!chdir('/tmp/mydir')) echo "failed chdir\n";
else if ($handle = opendir('.')) {
    while (false !== ($fileName = readdir($handle))) {
        $newName = preg_replace("/\.(jpg|gif|png)$/i","-img4sm.\1",$fileName);
        if($newName!=$fileName){
            if($test){
                echo "$fileName -> $newName\n";
            }else{
                if(!rename($fileName, $newName))echo "failed $fileName -> $newName\n";
            }
        }
    }
    closedir($handle);
}
?>

substitua /tmp/mydir pelo caminho do seu diretório. Execute o script com

php myrename.php

e imprimirá o nome do arquivo antigo e o novo nome de arquivo para cada arquivo correspondente. Se isso estiver correto, altere $test = 1; para $test = 0; e execute-o para verdadeiro. Lembre-se de fazer backup dos arquivos em algum lugar primeiro em caso de problemas.

    
por 20.10.2015 / 19:49
2

Infelizmente, rename significa coisas diferentes em diferentes versões do Unix. Em particular no Fedora e, portanto, no CentOS eu imagino, rename aceitará apenas strings simples, e não uma expressão perl como você está usando (o que funcionaria no debian).

No entanto, parece que tudo o que você quer fazer é adicionar "-img4sm". na frente do sufixo .jpg, .png e .gif, então com sua versão de renomear tente:

rename -- .jpg -img4sm.jpg *.jpg
rename -- .png -img4sm.png *.png
rename -- .gif -img4sm.gif *.gif

Sempre copie seu diretório em algum lugar como backup, caso esses comandos não façam o que você espera.

Se preferir, você pode instalar o mais sofisticado perl script rename cpan usando o cpan comando se você já sabe, ou simplesmente baixando o link nessa página para o baixar tar . Descompacte o tar e "construa" o script com

tar xf rename-1.9.tar.gz
cd rename-1.9
perl Makefile.PL 
make
mv bin/rename ~/bin/prename

em que o% final mv é para um diretório privado no seu PATH. Use o nome prename para evitar confusão com o comando renomear que você já possui. Você pode usar isso para fazer sua ação com, por exemplo:

prename -n  's/\.(jpg|png|gif)$/-mg4sm.$1/' -- *.{jpg,gif,png}

onde aqui -n significa apenas mostrar o que aconteceria, sem fazê-lo.

    
por 20.10.2015 / 11:55
2

com zsh :

autoload zmv # best in ~/.zshrc
zmv -n '(*).(png|jpg|gif)' '$1-mg4sm.$2'

Remova o -n para realmente fazer isso.

Caso contrário, POSIXly, você sempre pode fazer:

for file in *.png *.jpg *.gif; do
  echo mv -i -- "$file" "${file%.*}-mg4sm.${file##*.}"
done

(remova echo para fazer isso).

    
por 20.10.2015 / 13:03

Tags