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

8

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

Obteve a primeira parte desta pergunta do Stack Overflow :

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

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

senhor au
fonte
Você quer dizer "copiar todos os arquivos na árvore de origem em um diretório único (específico) sem subdiretórios"? Ou "copie todos os arquivos na árvore de origem em um subdiretório do diretório de destino semelhante ao local em que estava na árvore de origem"? Eu li a pergunta como o primeiro caso - você pode editar a pergunta para esclarecer? (Eu sei que você tem a sua resposta, mas ele será lido e utilizado, por outros.)
Volker Siegel

Respostas:

13

Você pode usar o comando -uswitch from cp:

copiar somente quando o arquivo SOURCE for mais novo que o arquivo de destino ou quando o arquivo de destino estiver ausente

ou use o rsynccomando com --ignore-existing:

pule os arquivos de atualização existentes no receptor

Exemplo:

rsync --ignore-existing source/* destination/
Ravexina
fonte
3

Seu comando original pode ser reescrito como:

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

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

Em geral, é possível 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/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"
Sergiy Kolodyazhnyy
fonte
2
Por statque testar a existência de arquivos no Bash? Não test -eseria muito mais simples?
David Foerster
@DavidFoerster Sem motivo específico. comando de teste também. Vou editar a minha resposta mais tarde, se eu não se esqueça
Sergiy Kolodyazhnyy
0

Leia man cpe use a --no-clobberopção para cp.

waltinator
fonte