O script basico abaixo percorre os arquivos no diretório atual, procurando por nomes de arquivos duplicados insensivelmente. Se uma correspondência for encontrada, será criada uma pasta "Duplicatas" que ainda não existe e, em seguida, moverá o arquivo duplicado para esse diretório.
O loop externo está lá para recalcular o arquivo globs ( *
) para os loops, no caso de um arquivo ser movido. O loop externo é executado até que nenhum arquivo seja movido.
#!/bin/bash
changes=1
while [ $changes -gt 0 ]
do
changes=0
for one in *
do
for two in *
do
shopt -u nocasematch
# if it's the exact same filename, skip
[[ "$one" == "$two" ]] && continue
shopt -s nocasematch
# if the file name matches case-insensitively, then mv it
if [[ "$one" == "$two" ]]
then
suffix=
while [ -d Duplicates"${suffix}" ]
do
suffix=$((suffix + 1))
done
mkdir Duplicates"${suffix}"
mv "$two" Duplicates"${suffix}"
changes=1
break
fi
done
done
done
Com estes arquivos de amostra:
afile.txt
TestFile1.TXT
TESTfile1.txT
testfile1.txt
Uma amostra de execução do script cria:
$ tree .
.
├── afile.txt
├── Duplicates
│ └── TestFile1.TXT
├── Duplicates1
│ └── testfile1.txt
└── TESTfile1.txT