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
mvoriginal na variávelMV - Obtém o último argumento para o qual foi chamado na variável
DEST - Se
DESTexistir 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 chamadamvtambém deve ser a própria função, porque seb-001.txttambé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
mvoriginal 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
3na instruçãoprintfpara 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.