Supondo que você tenha um shell POSIX, você pode fazer isso:
mv() {
eval "DEST=\${$#}" #The destination is the last positional parameter
if [ -e "$DEST" ] && ! [ -d "$DEST" ];then
PREFIX=${DEST%.*}
COUNT=1
EXT=${DEST##*.}
args= i=1
while [ $i -lt $# ]; do args="$args \"\${$i}\"" i=$((i+1)); done
DEST="$NAME-"$(printf "%03d" $COUNT)".$EXT"
while [ -e "$DEST" ];do
COUNT=$((COUNT+1))
DEST="$NAME-"$(printf "%03d" $COUNT)".$EXT"
done
eval "command mv $args \"\$DEST\""
else
command mv "$@"
fi
}
Como usar isso
Esta é uma função, portanto, salve-a no seu ~/.bashrc
e chame-a como você faria com o normal mv
.
O que isso faz
- Armazena o caminho para o executável
mv
original na variávelMV
- Obtém o último argumento para o qual foi chamado na variável
DEST
- Se
DEST
existir e não for um diretório, essa função pressupõe que sua renomeação esteja tentando destruir um arquivo - Em seguida, ele extrai o prefixo do nome final (qualquer coisa antes do final
.
, que marca a extensão), a extensão (qualquer coisa após o final.
), a contagem (se houver alguma coisa no prefixo após a final-
). - A contagem extraída é definida como zero se nenhuma contagem for encontrada. Caso contrário, ela será definida para a contagem encontrada na etapa anterior.
- A contagem atual é incrementada
- A função chama-se então com todos os argumentos originais (comutadores + nomes de arquivo) menos o último e adiciona o novo nome de arquivo em vez do último argumento na chamada original. O novo nome é o nome antigo, mas com um contador de 3 dígitos (com zero-enchimento) adicionado antes da extensão.
- A função é recursiva porque, se você estivesse dizendo
mv a.txt b.txt
, ele tentaria primeiromv a.txt b-001.txt
. Essa próxima chamadamv
também deve ser a própria função, porque seb-001.txt
também existir, queremos continuar incrementando o contador até encontrarmos um novo nome de arquivo que não existe. - Se o argumento final não existir ou for um diretório, o executável
mv
original será chamado com seus argumentos originais.
Advertências
- O número de vezes que você pode repetidamente tentar destruir um arquivo existente depende do tamanho do contador (999 vezes, neste caso). Você pode escolher um número de dígitos que englobe o limite de inode em seu sistema de arquivos para garantir que isso funcione enquanto você for capaz de criar arquivos.
- Se você tentar destruir um arquivo cujo nome seja semelhante a
foo-001.txt
, ele será movido parafoo-001-001.txt
.
Notas
- Para alterar o padrão de nomenclatura, altere a
3
na instruçãoprintf
para o que quiser. - Este código foi testado
- Isso é muito simplista e tenho certeza de que haverá casos extremos em que ele falhará miseravelmente. Estou feliz em tentar corrigi-los para você, se você encontrar algum. Enquanto isso, não tente isso em uma máquina de produção.