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.


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/

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"

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.