Como renomear arquivos em massa para remover um espaço estranho de antes da extensão

2

Eu tenho um monte de arquivos cujo nome de arquivo segue o padrão 'filename.ext'. por exemplo:

filename .ext

Gostaria de renomear tudo isso para remover o espaço antes do .ext. por exemplo:

filename.ext

Eu posso encontrá-los todos usando

find * -type f -name'* .*'

mas como posso renomear todos esses arquivos?

    
por Rich 28.04.2011 / 03:11

4 respostas

4

Crie um arquivo chamado "renamethis.sh". Seu conteúdo deve ser:

#!/bin/bash
mv "$1" "$(echo $1 | sed 's/ \././')"

Defina o bit executável: chmod a+x renamethis.sh . Em seguida, execute algo como:

find /path/to/dir -name '* .*' -type f -print0 | xargs -0L 1 /path/to/renamethis.sh

YMMV, sem garantia expressa ou implícita, etc.

FWIW, os espaços são o que torna isso estranho; Contanto que você não tenha outros caracteres excêntricos nos nomes dos arquivos, é bom seguir essa abordagem. Se fizer isso, você pode querer considerar algo como um loop scandir / readdir em Perl ou PHP, mas o script acima é a primeira coisa que veio à mente.

    
por 28.04.2011 / 03:41
1

Isso deve fazer isso por você.

#!/bin/bash

OLDIFS=${IFS}
IFS=$'\n'

for file in 'find * -type f -name '* .*''; do
 _ext='echo ${file} | cut -d '.' -f 2-'
 _filename='echo ${file} | cut -d ' ' -f 1'
 mv "${file}" ${_filename}.${_ext}
done

IFS=${OLDIFS}
    
por 28.04.2011 / 03:41
1

Em uma linha:

find -depth -name '* .*' -print0 |
perl -wn0e '$orig = $_; s/\s+\././g; rename($orig, $_) or warn "$orig: $!\n"'

Destaques:

  • não há problema em citar espaços em nomes de arquivos
  • não há problema com nomes de arquivos que começam com um traço
  • rápido: apenas dois processos iniciados em paralelo
  • lida com os diretórios corretamente
por 26.03.2013 / 14:37
0

Vejo que você já resolveu seu problema imediato, mas, no futuro, talvez você queira considerar o uso de mmv .

    
por 28.04.2011 / 09:24