Copie todos os arquivos em uma estrutura de diretórios em um caminho específico somente se o arquivo não existir lá já

8

Gostaria de copiar todos os arquivos de uma estrutura de diretórios para um diretório específico somente se o arquivo ainda não existir.

Obteve a primeira parte de esta pergunta sobre estouro de pilha :

find . -type f -exec cp {} /target-directory \;

Como posso verificar se o arquivo existe ou não? Se não, copie o arquivo, caso contrário pule.

    
por mr au 19.06.2017 / 21:09

3 respostas

13

Você pode usar a opção -u do comando cp :

  

copiar somente quando o arquivo SOURCE for mais recente que o arquivo de destino ou quando o arquivo de destino estiver faltando

ou use o comando rsync com --ignore-existing :

  

pula a atualização de arquivos que existem no receptor

Exemplo:

rsync --ignore-existing source/* destination/
    
por Ravexina 19.06.2017 / 21:12
3

Seu comando original pode ser reescrito como:

find . -type f -exec bash -c 'test -e /target-directory/"" || cp "" /target-directory' sh {} \;

A chave aqui é que chamamos shell com comandos específicos e passamos o arquivo encontrado como argument. Se test -e /target-directory/"" falhar, isso significa que o arquivo não existe e, nesse caso, cp copiará o arquivo.

Em geral, pode-se usar outros comandos, desde que o comando possa verificar a existência de um arquivo. Algumas das outras alternativas:

  • /usr/bin/realpath -e /target-directory/"" > /dev/null || cp "" /target-directory
  • stat >/dev/null /target-directory/"" || cp "" /target-directory/""
por Sergiy Kolodyazhnyy 19.06.2017 / 21:38
0

Leia man cp e use a opção --no-clobber para cp .

    
por waltinator 18.07.2017 / 06:37