Aqui está uma estrutura básica. Se algo der errado, o MAXTRYS interrompe a renomeação. Escolha um valor razoável.
#!/bin/bash
#
# Usage:
# numberedMove xy-file.txt TARGETDIR
#
file="$1"
targetDir="$2"
MAXTRYS=666
#
# @TODO
# add tests for permissions, maybe handle symlinks etc.
#
test -f "$file" || {
echo No such file "$file" or not an ordinary file
exit 1;
}
test -d "$targetDir" || {
echo No such directory "$targetDir"
exit 2;
}
#
# append NUM+1 to filename, to create unique name
#
numbered () {
fname="$1"
num=$2
if [[ $num -gt $MAXTRYS ]]
then
echo " giving up - max trys: $MAXTRYS "
exit 3
fi
# echo "mv $fname → $targetDir/$fname$num"
test -f "$targetDir/$fname$num" && numbered "$fname" $((num+1)) || mv "$file" "$targetDir/$fname$num"
}
#
# remove all SOMENAME and replace every blank with a dot
#
filtername () {
fname="$1"
fname=${fname//SOMENAME/}
fname=${fname// /.}
echo "$fname"
}
#
# filter filename, if unique: move, else move with number suffix
#
if [[ -e "$file" ]]
then
newname=$(filtername "$file")
if [[ ! -f "$targetDir/$newname" ]]
then
# echo "mv $file → $targetDir/$newname"
mv "$file" "$targetDir/$newname"
else
# echo "mv $file → $targetDir/$newname NUMBERED"
numbered "$newname" 1
fi
fi
Em filtername
, você pode adicionar mais regras e alterar as existentes.
Se isso fosse para minhas próprias necessidades, eu substituiria espaços em branco por '-', não '.', já que o ponto é um indicador bastante fraco (a.tar.bz2) para significado.
E eu iria recolher vários delimitadores para um, então em vez de:
mv "ab cd - SOMENAME..mp3" → "./B/ab.cd.-...mp3"
mv "ab cd - SOMENAME..mp3" → "./B/ab-cd-.mp3"
Eu manteria a extensão do arquivo e colocaria o número na frente da última extensão:
mv "ab cd- SOMENAME..mp3" → "./B/ab-cd-0.mp3"
mv "ab cd - SOMENAME..mp3" → "./B/ab-cd-1.mp3"
mv "ab cd -SOMENAME..mp3" → "./B/ab-cd-2.mp3"
já que muitos programas interpretam a extensão.
Eu só testei o programa com cerca de 10 arquivos, então faça um backup antes de usar e verifique, talvez pelo tamanho total do arquivo e contagem de arquivos, se a operação foi bem-sucedida.
Meus testes:
for f in a* ; do ./numberedMove.sh "$f" ./B ; done
Note que, ao colocar o programa no CWD, ele pode ser movido sozinho.