Posso usar o comando 'cp' com a opção -b, mas ele falhará se o arquivo de backup já existir?

2

Gostaria de usar cp -b para copiar um arquivo para um destino, possivelmente criando um arquivo de backup do caminho de destino, se já existir. Mas, se o arquivo de backup já existir, eu gostaria de ter cp com erro.

Eu sei que posso usar -n para evitar a supressão do arquivo target , mas eu quero, em vez disso, recusar-me a destruir o arquivo backup .

Existe uma maneira de fazer isso? Por acaso estou usando o GNU cp no Linux e estou disposto a aceitar uma resposta específica ao Linux se nenhuma opção POSIX estiver disponível.

    
por Christopher Schultz 15.07.2016 / 19:23

2 respostas

3

Se você quiser evitar a supressão de quaisquer arquivos de backup com o GNU cp , você pode usar backups numerados:

cp --backup=t  source destination

Em vez de substituir um backup, isso cria backups adicionais.

Exemplo

Como exemplo, vamos considerar um diretório com dois arquivos:

$ ls
file1  file2

Agora, vamos copiar o arquivo1 para o arquivo2:

$ cp --backup=t file1 file2
$ ls
file1  file2  file2.~1~

Como podemos ver, foi feito um backup.

Vamos copiá-lo novamente:

$ cp --backup=t file1 file2
$ ls
file1  file2  file2.~1~  file2.~2~

Outro backup foi feito.

Documentação

A partir de man cp , pouco antes do final da seção "descrição", as várias opções possíveis para --backup são detalhadas:

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. The version control method may be selected via the --backup option or through the VERSION_CONTROL environment variable. Here are the values:

none, off
     never make backups (even if --backup is given)

numbered, t
     make numbered backups

existing, nil
     numbered if numbered backups exist, simple otherwise

simple, never
     always make simple backups

As a special case, cp makes a backup of SOURCE when the force and backup options are given and SOURCE and DEST are the same name for an existing, regular file.

    
por 16.07.2016 / 00:36
0

Se você sempre usa isso para copiar apenas um arquivo, pode criar uma função de shell, possivelmente em ~/.bashrc like

cpb () 
{ 
    if [ -r "${2}/${1}~" ] ; then 
        echo "backup of '$1' exists in '$2'"
    else 
        cp -b "$1" "$2"
    fi
}

e usá-lo assim:

$ mkdir dir
$ cpb x dir
$ cpb x dir
$ cpb x dir
backup of 'x' exists in 'dir'
$ ls -l dir
insgesamt 0
-rw-r--r-- 1 ott ott 0 Jul 16 01:09 x
-rw-r--r-- 1 ott ott 0 Jul 16 01:08 x~
    
por 16.07.2016 / 01:16