remove o espaço em branco de todos os itens em um diretório e subdiretório

3

Eu tenho um diretório que contém arquivos e sub-diretórios, alguns dos quais têm espaços em branco em seus nomes. Além disso, cada um desses subdiretórios contém arquivos com espaço em branco em seus nomes. Existe uma maneira simples de remover o espaço em branco de todos os nomes no diretório pai e todos os subdiretórios de uma só vez?

    
por Wintermute 10.07.2015 / 17:35

2 respostas

1

Is there a simple way to remove the whitespace from all the names in the parent directory and all sub directories at once?

Sim, existe:

find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;

Outras leituras

Boa sorte!

    
por 11.07.2015 / 01:06
3

Use o comando find para enumerar os arquivos que você precisa renomear. Selecione apenas nomes de arquivos com espaços para desempenho. Passe a opção -depth para atuar em arquivos em subdiretórios antes de agir no próprio diretório, já que renomear os diretórios como find está passando por eles resultará na perda de alguns diretórios.

find /path/to/directory -depth -name '* *' -exec … {} +

Se você tiver o comando prename , ele aplicará uma expressão Perl para renomear arquivos. Você precisa tomar cuidado para agir apenas no nome base do arquivo, não no caminho do diretório inteiro. Se seu find tiver a ação -execdir , essa é uma maneira conveniente de fazer isso:

find /path/to/directory -name '* *' -execdir prename 's/ //g' {} +

Substitua s/ //g por s/ /_/g para substituir espaços por sublinhados em vez de removê-los completamente ou s/ +/_/g para substituir seqüências de espaços por um único sublinhado.

Sem -execdir , você precisa da lógica de evitação de diretórios no código Perl.

find /path/to/directory -depth -name '* *' -exec prename '
    s:.*/::; $dir=$&;
    s/ //g;
    $_="$dir$_"
' {} +

Se você não tiver prename , poderá fazer isso com um script de shell. Você precisará invocar um shell de find . Se você tiver ksh, você pode usar sua construção ${file// /} para obter o valor da variável file com espaços removidos (use ${file// /_} para substituir cada espaço por um sublinhado):

find /path/to/directory -depth -name '* *' -execdir ksh -c '
    mv "$0" "${0// /}"
' {} \;

ou

find /path/to/directory -depth -name '* *' -exec ksh -c '
    for file do
      dir=${file%/*};
      file=${x##*/};
      mv "$dir/$file" "$dir/${file// /}";
    done
' _ {} +

Se você tem bash ou mksh, você pode usá-lo em vez de ksh. Se você não tem nenhum, você pode usar sed para fazer o processamento da string.

find /path/to/directory -depth -name '* *' -exec sh -c '
    for file do
      dir=${file%/*};
      file=${x##*/};
      without_spaces=$(printf %s "$file." | sed "s/ //g")
      mv "$dir/$file" "$dir/${without_spaces%.}";
    done
' _ {} +
    
por 13.07.2015 / 01:17