Como testar quais arquivos serão copiados com o comando cp?

7

Estou criando um script simples que copia todos os arquivos de DIRECTORYA que não existem em DIRECTORYB. Estou fazendo isso através do uso do comando cp:

cp -u DIRECTORYA/* DIRECTORYB

O que eu gostaria de fazer é também enviar um email para um administrador que listará os arquivos que foram copiados.

Então, idealmente, antes de executar o comando acima, gostaria de obter os arquivos que serão copiados e armazená-los em uma variável para uso posterior ao criar minha mensagem de e-mail.

Alguém pode me apontar na direção certa? Eu olhei em usando grep mas eu não acho que isso pode ser feito com o comando cp?

    
por James 03.03.2015 / 16:53

5 respostas

2

De acordo com a página de manual ,

-u, --update
copy only when the SOURCE file is newer than the destination file or when the destination file is missing

este é um recurso que combina dois testes, um trivial para implementar em um script ( ausente ) e um que requer algum trabalho ( mais recente ). Você pode criar um script que relate o que é necessário usando comm , diff e test .

Nenhum dos utilitários cp padrão fornece a capacidade de executar uma operação de cópia a seco. Como sugerido, rsync é a maneira de fazer isso com um utilitário comumente disponível. É claro que rsync é normalmente usado para copiar com base em mais critérios do que apenas mais recente ou ausente (tamanho de arquivo e timestamps também são usados). Mas isso pode ser reduzido a fazer apenas cp -u .

Para utilitários não-padrão, há o utilitário copy que escrevi (e, claro, ainda uso) no final dos anos 80. Provavelmente foi inspirado pelo utilitário make , já que a primeira opção que adicionei foi -n .

Para o exemplo dado, seria usado assim:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Leitura adicional:

  • copiar - utilitário de cópia de arquivos / diretórios

    -n disables the actual creation or modification of files, and (depending on the level of verboseness) shows the effect which the copy command would have.
    -u copies files only if their size or modification date differs, and links only if the link-text differs.
    -U copies only files that are newer than the destination, or that do not exist in the destination.

  • entrada do changelog de agosto de 1988 :

    1988-08-16    
            * src/copy/src/copy.c: added "-d" and "-n" options.
    
por 10.07.2016 / 18:12
1

Se você queria executar cp foo*bar whatever , execute echo foo*bar whatever .

    
por 03.03.2015 / 19:37
1

Eu não acho que o GNU cp tenha algo para ajudá-lo se você quiser ver o que faria sem agir. Se você quiser registrar os arquivos que foram modificados, você pode usar a opção -v :

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Em vez de cp , você pode usar rsync , que é muito mais poderoso e instalado em quase todos os lugares, exceto para sistemas incorporados de baixo custo (e fáceis de instalar onde não estão presentes por padrão).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

ou

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
    
por 04.03.2015 / 01:05
1

Você pode usar o comando diff. Eu tenho um trabalho que copia alguns arquivos de backup todos os dias. algum tempo eu preciso verificar se todos os arquivos são copiados, aqui está a sintaxe:

diff /file1/ /file2/

e, claro, se você quiser copiá-los, use:

cp -u /file1/* /file2
    
por 25.07.2016 / 08:32
0

Considere o uso do rsync. O Rsync funciona perfeitamente bem em cópias locais e pode certamente fazer o que você quiser, depois de percorrer as 15 opções de gazillion que ele tem.

rsync -avun DIRECTORYA/ DIRECTORYB

mostrará tudo o que você faria e

rsync -avu DIRECTORYA/ DIRECTORYB

fará isso.

    
por 25.07.2016 / 10:26

Tags