Como posso copiar arquivos com nomes de arquivos duplicados em um diretório e reter os dois arquivos renomeando as duplicatas automaticamente?

11

No sistema operacional Windows, quando você copia um arquivo em um diretório que já possui um arquivo com esse nome, ele pergunta se você deseja:

  1. copie o arquivo e substitua / substitua o existente
  2. cancelar a cópia do novo arquivo no diretório
  3. copie o arquivo, mas renomeie-o (como algo como "filename - copy (1)")

Quando faço isso no Ubuntu, não tenho a terceira opção (que muitas vezes é uma opção muito útil). Existe alguma maneira de conseguir fazer isso no Ubuntu?

heisenbergman
fonte

Respostas:

17

Infelizmente o Nautilus não tem essa opção.

Opção 1: Um gerenciador de arquivos diferente

Você pode tentar outro gerenciador de arquivos como o Dolphin .

Instale o Dolphin(requer o repositório Universe )

Opção 2: linha de comando

Você também pode usar o programa de linha de comando cp(1)com a opção de backup:

cp --backup -t DESTINATION SOURCE [SOURCE...]

Isso tem os seguintes efeitos que podem ser controlados com outras opções, conforme descrito na página de manual de cp(1):

--backup[=CONTROL] - faça um backup de cada arquivo de destino existente

-b- gosta --backupmas não aceita um argumento

-S, --suffix=SUFFIX- substitua o sufixo de backup usual

O sufixo de backup é ~, a menos que definido com --suffixou SIMPLE_BACKUP_SUFFIX. O método de controle de versão pode ser selecionado via --backupopção ou através da VERSION_CONTROLvariável de ambiente. Aqui estão os valores:

  • none, off: nunca faça backups (mesmo que --backupseja fornecido)
  • numbered, t: faça backups numerados
  • existing, nil: numerado se existirem backups numerados, simples caso contrário
  • simple, never: sempre faça backups simples

Exemplo

cp --backup=existing --suffix=.orig -t ~/Videos ~/Music/*

Isso copiará todos os arquivos ~/Musicpara ~/Videos. Se um arquivo com o mesmo nome existir no destino, ele será renomeado anexando-o .origao nome como backup. Se existir um arquivo com o mesmo nome que o backup, ele será renomeado anexando-o .1e, se existir, também .2. Somente então o arquivo de origem é copiado para o destino.

Se você deseja copiar arquivos em subdiretórios recursivamente, use:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music
David Foerster
fonte
Obrigado pela sugestão de usar um gerenciador de arquivos diferente. Infelizmente, Thunar também não tem a opção a que me refiro. Apenas possui: Cancelar, Ignorar tudo, Ignorar, Substituir, Substituir tudo. Vai experimentar o Dolphin.
amigos estão dizendo sobre heisenbergman
1
Dolphin funciona muito bem para isso :)
heisenbergman
Obrigado por experimentar os dois. Vou atualizar minha pergunta de acordo com suas descobertas.
precisa
@heisenbergman, Oi, o que você quis dizer com Dolphin funciona muito bem para isso? Ele oferece a opção de renomear, mas ainda me permite renomear os arquivos um por um. Infelizmente, a opção "aplicar a todos" não pode ser usada com a opção de renomear. Isso é bastante inútil para uma grande quantidade de arquivos. Esta é apenas a minha versão? Você conseguiu renomear todas as suas duplas de uma só vez (como no Windows), usando o Dolphin?
27418 Kvothe
2

Encontrei isso no superusuário :

#!/bin/bash
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"

O arquivo que tem o mesmo nome é renomeado para o arquivo com o md5sum adicionado ao nome. Se você o salvar em um nome de arquivo como "saveCopy", poderá usá find-lo desta forma para executá-lo:

find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;

Para mais informações, consulte o link.

Rinzwind
fonte
0

Copie este script para o diretório superior, torne-o executável e execute-o:

#!/bin/bash

## Get a list of all files
list=$(find . -mindepth 2 -type f -print)
nr=1

## Move all files that are unique
find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
    mv -n $file ./
done
list=$(find . -mindepth 2 -type f -print)

## Checking which files need to be renamed
while [[ $list != '' ]] ; do
   ##Remaming the un-moved files to unique names and move the renamed files
   find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
       current_file=$(basename $file)
       mv -n $file "./${nr}${current_file}"
   done
   ## Incrementing counter to prefix to file name
   nr=$((nr+1))
   list=$(find . -mindepth 2 -type f -print)
done
Warhansen
fonte