Para usar arquivos com espaços, você pode usar o caractere de escape ou aspas duplas.
exemplo:
cd new\ dir/
\
é chamado de caractere de escape, usado para não expandir o espaço, então agora o bash lê o espaço como parte do nome do arquivo.
Ou você pode usar:
cd "new dir"
Agora, para renomear arquivos, é tão fácil renomear todos os arquivos com espaços e substituir espaço por sublinhado:
for file in * ; do mv "$f" "${f// /_}" ; done
veja a resposta aqui existe um script para renomear todos os arquivos e dirs de forma recursiva.
O script é: (todos os direitos vão para o proprietário)
#!/bin/bash
# set -o xtrace # uncomment for debugging
declare weirdchars=" &\'"
function normalise_and_rename() {
declare -a list=("${!1}")
for fileordir in "${list[@]}";
do
newname="${fileordir//[${weirdchars}]/_}"
[[ ! -a "$newname" ]] && \
mv "$fileordir" "$newname" || \
echo "Skipping existing file, $newname."
done
}
declare -a dirs files
while IFS= read -r -d '' dir; do
dirs+=("$dir")
done < <(find -type d -print0 | sort -z)
normalise_and_rename dirs[@]
while IFS= read -r -d '' file; do
files+=("$file")
done < <(find -type f -print0 | sort -z)
normalise_and_rename files[@]