Você pode testar seu script com a alteração proposta, comentando o comando mv
e executando-o. Há algumas coisas demais acontecendo no script para eu dizer imediatamente que seria ok, mas se o script atual funcionar (você obviamente não tem nomes de diretório com novas linhas nelas, ou a matriz array
seria quebrada , ou nomes começando com traços que potencialmente confundiriam mv
e echo
em alguns lugares) então eu arriscaria adivinhar que estaria tudo bem.
Para substituir espaços com sublinhados nos nomes de arquivos de diretórios e outros arquivos recursivamente:
topdir=.
find "$topdir" -depth -name "* *" -exec bash -c '
for pathname do
# $pathname will have at least one space in it
newname=${pathname##*/} # get basename
newname=${newname// /_} # replace spaces with underscores
printf "Would move %s to %s\n" "$pathname" "${pathname%/*}/$newname"
# mv "$pathname" "${pathname%/*}/$newname"
done' bash {} +
Isso encontraria qualquer coisa dentro ou abaixo de $topdir
que contivesse pelo menos um espaço em seu nome. Ele coletaria esses nomes de caminho e os daria a um script bash
em linha. O script extrairia a parte do nome do arquivo de cada nome de caminho e substituiria os espaços por sublinhados. A operação mv
real é comentada por segurança.
A opção -depth
é necessária aqui, pois não queremos renomear os diretórios que ainda não visitamos. Com ele, find
fará uma travessia em profundidade da hierarquia de diretórios.
Substituições de parâmetros usadas:
-
${variable##*/}
: remove tudo antes da última barra no valor devariable
. Mais ou menos o mesmo que$( basename "$variable" )
. -
${variable%/*}
: remove tudo após a última barra. Mais ou menos o mesmo que$( dirname "$variable" )
. -
${variable//pattern/replacement}
: substitui tudo que combinapattern
comreplacement
no valor devariable
(essa é uma extensãobash
)
Nenhuma verificação é feita para saber se o novo nome de arquivo já existe ou não. Isso pode ser feito facilmente no script bash
interno com, por exemplo,
if [ -e "${pathname%/*}/$newname" ]; then
printf "Will not rename %s, new name exists\n" "$pathname" >&2
else
printf "Would move %s to %s\n" "$pathname" "${pathname%/*}/$newname"
# mv "$pathname" "${pathname%/*}/$newname"
fi
Teste:
$ tree
.
|-- a directory
| '-- yet another file
|-- script.sh
|-- some file
'-- some other file
1 directory, 4 files
$ sh script.sh
Would move ./some file to ./some_file
Would move ./some other file to ./some_other_file
Would move ./a directory/yet another file to ./a directory/yet_another_file
Would move ./a directory to ./a_directory
Relacionados: