Copie arquivos com renomeação

27

Eu tenho uma árvore de arquivos enorme. Alguns arquivos têm o mesmo nome, mas em casos diferentes, por exemplo, some_code.c e Some_Code.c .

Então, quando eu estou tentando copiá-lo para um sistema de arquivos NTFS / FAT, ele me pergunta se eu quero substituir o arquivo ou ignorá-lo.

Existe alguma maneira de renomear automaticamente esses arquivos, por exemplo, adicionando  (1) ao nome do arquivo de conflito (como o Windows 7 faz)?

    
por Alexander Dzyoba 14.07.2011 / 11:56

3 respostas

35

Muitas ferramentas GNU, como cp , mv e tar , suportam a criação de arquivos de backup quando o destino existe. Ou seja, ao copiar foo para bar , se já houver um arquivo chamado bar , o existente bar será renomeado e após a cópia bar conterá o conteúdo de foo . Por padrão, bar é renomeado para bar~ , mas o comportamento pode ser modificado:

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo → foo~
cp -r --backup=t source target  #   rename foo → foo.~1~ (or foo.~2~, etc)

Existem outras variantes, como a criação de backups numerados somente quando um já existe. Consulte o manual do coreutils para obter mais detalhes.

    
por 24.07.2011 / 00:41
6

Eu tentei

apropos copy | grep "(1)" 

para encontrar possíveis candidatos, e mcopy apareceu.

man mcopy 

mostra uma opção promissora -D clash-option não é legal? Mas não tão legal - não é descrito. Mas há algumas dicas para mtools.dvi, que eu procurei no meu sistema, sem sucesso, e via google, sem sucesso, mas depois, com o google, eu procurei diretamente por mcopy clash-option e descubra este site .

Eu fiz um pequeno teste

mcopy -D A f* a 

para testes de autorename e targetdir a - em vez de autorenaming ele me pediu para cada arquivo para ignorar ou anular, esse idiota ....

Minha versão é mtools-4.0.10 e a página de ajuda é de 1996 - 15 anos. Deveríamos realmente perder alguns recursos, enquanto isso?

Eu dividiria o trabalho em duas etapas:

  • Crie uma função curta, que gera um nome exclusivo para um arquivo, se esse nome estiver ocupado.
  • Execute find e execute esse script para cada arquivo que você deseja copiar.

Devemos ajudar nessa abordagem? :)

Aqui está um script para os arquivos de nome de usuário:

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 

e esta é a minha invocação de teste:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

Observação: -maxdepth, -name e -type, usados para restringir drasticamente o número de arquivos afetados. Eu não testei o script para estruturas de arquivos mais profundas, nem para espaços em branco em nomes de arquivos e outros caracteres funky como linefeed, pagefeed e assim por diante.

Eu usei 0,1 porque não causa problemas na maioria dos comandos, enquanto a (e a) geralmente precisam de mascaramento.

    
por 14.07.2011 / 22:23
0

Não com o GNU cp , pelo menos.

É altamente recomendado que você não tenha nomes de arquivos duplicados (ignorando maiúsculas e minúsculas), eles apenas causarão um mundo de dor. Encontre uma lista de tais duplicatas usando

find . | tr A-Z a-z | sort | uniq -d

Em seguida, renomeie manualmente um dos arquivos para cada linha, se saída. Tente evitar a criação de duplicatas no futuro.

    
por 14.07.2011 / 15:44