mv, renomeie se existir

26

Preciso montar muitas imagens em um diretório. Muitas dessas imagens têm o mesmo nome de arquivo.

Existe alguma versão segura mvque renomeie os arquivos automaticamente se o nome do arquivo de destino já existir para que pic1.jpegse torne algo parecido pic1_2.jpeg?

Eu poderia escrever meu próprio script python, mas deve haver algo assim por aí para que eu possa fazer:

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;
O duque
fonte

Respostas:

38

O mv já suporta isso imediatamente (pelo menos no Debian):

mv --backup=t <source_file> <dest_file>

Como visto na página de manual do mv (1):

--backup[=CONTROL]
         make a backup of each existing destination file

The  backup  suffix  is  `~',  unless  set  with   --suffix   or   SIM‐
PLE_BACKUP_SUFFIX.   The version control method may be selected via the
--backup option or through the  VERSION_CONTROL  environment  variable.

Para --backup=tsignificar "fazer backups numerados", chame da seguinte maneira:

env VERSION_CONTROL=numbered mv --backup=t <source_file> <dest_file>

(é claro que dest_file pode ser um diretório).

Edit: em versões posteriores (pelo menos GNU coreutils 8.22, mas já muito antes) você pode simplesmente escrever

mv --backup=numbered <source_file> <dest_file>
MasterM
fonte
1
+1 para uma solução incrivelmente limpa. Aliás, a opção também está presente no RHEL 6.
Paweł Brodacki
Embora seja uma funcionalidade agradável, isso realmente não ajuda muito no meu caso, já que acrescentará o sufixo após a extensão; portanto, os arquivos terminam com nomes como .jpg ~ 1 ~, enquanto eu precisaria deles com o nome _1.jpg. Provavelmente usarei o mmv para renomear os arquivos depois de movê-los.
Theduke
4
este é o comando mmv que vai alcançar o meu resultado desejado depois de fazer mv --backup = numeradas: mmv -v " "# 1_ # 3. # 2" ~ * ~."
theduke
No meu sistema Debian (mmv 1.01b-18), o comando mmv correto é:mmv -v "*.*~*~" "#1_#3.#2"
Xavier