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' "{}" \;
Boa sorte!
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?
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' "{}" \;
Boa sorte!
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
' _ {} +