O segundo passo no seu pipeline é um pouco quebrado (ele manuseia barras invertidas e espaços em branco iniciais e finais) e é uma maneira complicada de se fazer isso. Use tr
para converter em minúsculas. Você não deve limitar a busca aos arquivos: os diretórios podem colidir também.
find . | tr '[:upper:]' '[:lower:]' | LC_ALL=C sort | LC_ALL=C uniq -d
Observe que isso só funciona se os nomes de arquivos não contiverem novas linhas. No Linux, mude para bytes nulos como o separador para lidar com novas linhas.
find . -print0 | tr '[:upper:]' '[:lower:]' | LC_ALL=C sort -z | LC_ALL=C uniq -dz
Isto imprime as versões minúsculas de nomes de arquivos, o que não é propício para fazer algo sobre os arquivos.
Se você estiver usando o zsh, esqueça o find
: zsh tem tudo o que você precisa incluir.
setopt extended_glob
for x in **/*; do
conflicts=($x:h/(#i)$x:t)
if (($#conflicts > 1)); then
## Are all the files identical regular files?
h=()
for c in $conflicts; do
if [[ -f $c ]]; then
h+=(${$(md5sum <$c)%% *})
else
h=(not regular)
break
fi
done
if (( ${#${(@u)h}} == 1 )); then
# Identical regular files, keep only one
rm -- ${conflicts[1,-2]}
else
echo >&2 "Conflicting files:"
printf >&2 ' %s\n' $conflicts
fi
fi
done