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

11

Estou criando um script simples que copia todos os arquivos do DIRECTORYA que não existem no 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 email.

Alguém pode me apontar na direção certa? Eu olhei para usar grep, mas não acho que isso possa ser feito com o comando cp?

James
fonte
1
Talvez eu esteja entendendo mal a sua pergunta, mas você não pode usar a -vbandeira para imprimir os nomes de arquivos à medida que são copiados? Redirecione para um arquivo ou diretamente em uma variável e use-a para criar sua mensagem.
ThiagoutRenaux 31/03/2019
Além disso, o cpcomando possui a opção --attributes-onlyque permite não copiar dados dos arquivos, mas apenas a estrutura de diretórios e arquivos.
Costas
Desculpe, eu sou relativamente novo em scripts. Se eu usar o sinalizador -v, como posso gerar uma saída para uma variável em vez de um arquivo?
James
1
Supondo que você esteja usando o bash, variable=$(cp -v ...)captura o stdout do cp. Veja gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham 3/15/15

Respostas:

4

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

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

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

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

ou

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
Gilles 'SO- parar de ser mau'
fonte
2

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

VaTo
fonte
Mas o OP quer rodar cp -ue ele está procurando uma opção semelhante à corrida a seco para o cp.
Arkadiusz Drabczyk 03/03
2

De acordo com a página do manual ,

-u, copie apenas quando o arquivo SOURCE for mais novo que o arquivo de destino ou quando o arquivo de destino estiver ausente--update

esse é um recurso que combina dois testes, um trivial para implementar em um script ( ausente ) e outro que exige algum trabalho ( mais recente ). Você pode criar um script que relate o que é necessário usar comm, diffe test.

Nenhum dos cputilitários padrão oferece 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. Obviamente, rsyncgeralmente é usado para copiar com base em mais critérios do que apenas mais novos ou ausentes (o tamanho do arquivo e os carimbos de data e hora também são usados). Mas pode ser reduzido a fazer apenas cp -u.

Para utilitários fora do padrão, existe o copyutilitário que escrevi (e, é claro, ainda uso) no final dos anos 80. Provavelmente foi inspirado pelo makeutilitário, pois 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:

  • copy - utilitário de cópia de arquivo / diretório

    -n desativa a criação ou modificação real de arquivos e (dependendo do nível de detalhamento) mostra o efeito que o copy comando teria.
    -u copia arquivos apenas se o tamanho ou a data da modificação diferirem e os links somente se o texto do link for diferente.
    -U copia apenas arquivos que são mais novos que o destino ou que não existem no destino.

  • registro de alterações desde agosto de 1988 :

    16/08 1988    
            * src / copy / src / copy.c: adicionadas opções "-d" e "-n".
    
Thomas Dickey
fonte
0

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 foram copiados, aqui está a sintaxe:

diff /file1/ /file2/

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

cp -u /file1/* /file2
poori
fonte
0

Considere usar o rsync. O Rsync funciona perfeitamente bem em cópias locais e certamente pode fazer o que você deseja, depois de percorrer as quinze bilhões de opções disponíveis.

rsync -avun DIRECTORYA/ DIRECTORYB

mostrará tudo o que seria feito e

rsync -avu DIRECTORYA/ DIRECTORYB

vai fazer isso.

Edward Falk
fonte