Encontre e renomeie arquivos (incluindo diretórios) cujos nomes de arquivos contenham espaço [duplicado]

3

Eu tenho um grande número de arquivos e diretórios com espaços em seus nomes de arquivos em meus sistemas de arquivos ext4.

Como devo encontrar e renomeá-los com segurança? Eu tenho bash e estou executando o Ubuntu.

É possível renomear interativamente cada arquivo encontrado, ou seja, ser perguntado se eu quero renomear o que para cada arquivo?

Qual convenção para escolher nomes de arquivos você usaria para renomeá-los?

    
por Tim 28.02.2016 / 00:56

3 respostas

4

Esse script localizará todos os arquivos em um diretório de destino e gerará um novo script que renomeará todos os arquivos para não ter espaços. Você pode então revisar o roteiro como quiser antes da execução:

#!/bin/bash
TARGET=/path/to/files
NEWSCRIPT=${HOME}/rename-spaced-files.sh

OLDIFS="${IFS}"
IFS="\n"
for file in $(find ${TARGET}/ -type f -name "* *"); do
    if [[ -f \"${file// /}\" ]]; then
        echo "# \"${file// /}\" already exists- come up with a new name for it and uncomment the next line" >> $NEWSCRIPT
        echo -n "# " >> $NEWSCRIPT
    fi
    echo "mv \"${file}\" \"${file// /}\"" >> $NEWSCRIPT

done
    
por 28.02.2016 / 01:13
4

Por diretório, usar renomear é fácil:

rename 's/\s/_/g' *

Isso eliminará todos os espaços nos nomes de arquivos no diretório e os substituirá por '_'. Se você deixar o 'g', só substituiria o primeiro espaço no nome do arquivo, então não esqueça essa parte. * significa todos os arquivos no diretório em que você o executa.

rename 's/\s/_/g' /home/you/something/*

Substituiria todos os espaços nos nomes de arquivos no diretório: /home/you/something/

Isso não cobre muitos diretórios, mas é assim que eu faço em geral.

Eu gosto de sublinhados, isso mudaria:

my file with spaces.txt

para

my_file_with_spaces.txt
    
por 28.02.2016 / 01:10
2

Embora ter espaços em nomes de arquivos seja totalmente legítimo no Unix e em seus sistemas de arquivos, você deve tomar cuidado para citar os nomes ao usá-los com comandos de shell ou de variáveis, e. g. em scripts. Além disso, o shell passará cada palavra como um parâmetro separado para o comando.

VAR="existing file with spaces in name"

#This works
ls "${VAR}"

#This results in file(s) not found
ls ${VAR}

Além das respostas já fornecidas, você também pode usar o comando mmv para renomeie vários arquivos cujos nomes correspondem a um padrão, independente dos espaços nos nomes, porque com mmv você precisa citar o padrão de origem e de destino de qualquer forma.

E descaradamente citando a mim mesmo (trocadilho não intencional mas aceito alegremente):

Rule of thumb: Always use quotes around shell variables that contain strings when expanding them; they may contain spaces or be empty, which when unquoted often confuses the command they're passed to (too many or missing parameters).

    
por 28.02.2016 / 01:50