com zsh
:
autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)' '$1${2// /_}'
Como em seu código, ele não renomeia arquivos ocultos. Ele não olha dentro de diretórios ocultos também. Se você quiser renomeá-los, altere para:
autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)(#qD)' '$1${2// /_}'
O bash
equivalente (mas sem as salvaguardas fornecidas por zmv
, portanto, talvez você queira adicionar uma opção -i
a mv
) dessa última seria:
LC_ALL=C find . -depth -name '* *' -exec bash -c '
for file do
base=${file##*/}
mv -i -- "$file" "${file%/*}${base// /_}"
done' bash {} +
Não existe um equivalente fácil do primeiro, pois não é possível combinar -prune
(que seria necessário não descer em diretórios ocultos) e -depth
. Um funcionalmente equivalente poderia, no entanto, ser escrito como:
LC_ALL=C find . -depth -name '* *' ! -path '*/.*' -exec bash -c '
for file do
base=${file##*/}
mv -i -- "$file" "${file%/*}${base// /_}"
done' bash {} +
Ele iria descer em dirs ocultos, mas não renomear arquivos lá.