Exclui o espaço em branco em nomes de arquivos no diretório

3

Eu tenho um diretório onde alguns nomes de arquivos foram incorretamente nomeados something .pdf em vez de something.pdf . Existe um forro rápido que eu possa usar para excluir o espaço em branco nos nomes de arquivos.

Eu tentei find -name "* .pdf" -type f | rename 's/ //g'

mas isso não funcionou.

    
por moadeep 08.04.2013 / 14:33

2 respostas

6

No zsh, isso é feito facilmente com a função zmv . Coloque autoload -U zmv no seu ~/.zshrc , ou execute isso uma vez no seu shell, então:

zmv '* .pdf' '${f// /}'

Isso remove todos os espaços do nome do arquivo. Se você quiser remover apenas o anterior à extensão .pdf :

zmv '* .pdf' '${f# .pdf}.pdf'

ou usando parênteses para delimitar grupos que podem ser usados como referências anteriores:

zmv '(*) .pdf' '$1.pdf'

Se você deseja também agir em subdiretórios:

zmv '**/* .pdf' '${f# .pdf}.pdf'

ou (observe que você precisa usar (**/) , não (**)/ ):

zmv '(**/)(*) .pdf' '$1$2.pdf'

No Linux, com ou sem zsh, se houver apenas um espaço espúrio nos nomes dos arquivos:

rename \ .pdf .pdf *\ .pdf

ou, se houver apenas um espaço nos nomes originais:

rename ' ' '' *\ .pdf

Se você quiser atuar em subdiretórios, em ksh93 ≥o + ou bash ≥4, você pode usar ** para corresponder arquivos em subdiretórios. No bash, você precisa executar shopt -s globstar first (colocar essa linha no seu ~/.bashrc ) e set -o globstar no ksh93.

rename \ .pdf .pdf **/*\ .pdf

Tenha em atenção que o bash segue os links simbólicos quando recorrer aos diretórios.

Sem o benefício de ** , você pode usar find para reciclar.

find . -name '* .pdf' -exec rename ' .pdf' .pdf {} +

Sob o Debian e derivados (incluindo Ubuntu) e a maioria dos sistemas não-Linux que vêm com perl , o comando rename é diferente, o que leva uma expressão Perl como um argumento ao invés de uma string para substituir e seqüência de substituição. Use rename.ul nos comandos acima (sob o Debian e derivados), ou com o Perl rename :

rename 's/ \.pdf$/.pdf/' -- *\ .pdf    # strip the space before the extension
rename 's/ //g' -- *\ .pdf             # strip all spaces
    
por 10.04.2013 / 03:34
0

Isso protegerá contra sobregravação acidental, se for importante.

IFS=$'\n'
for i in $(find . -name '* .pdf')
do
  mv -i "$i" "${i% .pdf}.pdf"
done

Se você executar isso em um shell interativo, você pode querer sair dele imediatamente desde que você alterou o IFS.

    
por 09.04.2013 / 18:17