A conversão para minúsculas pode ser feita digitando-se um var em minúsculas.
EDIT: Solução substituída com find
para uma solução com for
.
Primeiro tentei uma solução usando find
, esperando encontrar arquivos apenas com -type f
.
Isso parece funcionar bem:
Eu usei -maxdepth 1
, então eu não mudei nada em outras pastas (o que seria um pouco mais difícil quando um nome de diretório está em maiúsculas).
Isso resultou em
typeset -l smallfile
echo "Find solution looks OK but read more..."
find .-maxdepth 1 -type f| while read file; do
smallfile="${file}"
mv "${file}" "${smallfile}"
done
Eu pensei que esta construção iria lidar com nomes de arquivos com espaços corretamente, o que eu testei com nomes de arquivos como "File with Spaces". @Chazelas comentou corretamente que a solução falha com nomes de arquivos que terminam com um espaço ("Muito ruim"). Outro comentário explica como corrigir o find
-command: find ... -print0 | while IFS= read -rd '' file
(seu find
deve suportar print0
, principalmente bash
e zsh
).
Como eu já estou usando um loop, também posso usar test
para ver que o item atual (fornecido por *
) é um arquivo regular.
Eu encontrei uma solução com um loop simples e mostrei aqui, incluindo meu código de teste.
#!/bin/bash
clear
rm -rf testfiles 2>/dev/null
mkdir -p testfiles/SomeDir #2>/dev/null
mkdir testfiles/"Crazy Dir" 2>/dev/null
touch testfiles/Aha testfiles/"File with Spaces" testfiles/"End with space "
ls -lQ testfiles
echo ===================
typeset -l smallfile
for file in testfiles/* # Stack's formatting thinks /* starts comment, so I close that here: */
do
if [ -f "${file}" ]; then
smallfile="${file}"
# echo mv "${file}" "${smallfile}"
mv "${file}" "${smallfile}"
fi
done
echo ===================
ls -lQ testfiles
Para o diretório atual, remova testdir/
do loop for.