
Existe uma maneira de cp
a opção ' --update
imprimir arquivos que não foram copiados porque o diretório de origem continha uma versão mais recente do arquivo?
Responder1
Substituir cp -ur
com rsync -urvv
.
Os dois "v" não são um erro de digitação: eles existem para aumentar a verbosidade, para mostrar os arquivos que foram ignorados.
Os arquivos ignorados serão parecidos com the_filename is newer
, portanto, para obter a lista de arquivos ignorados, você pode usar esta linha:
rsync -urvv source/ target | grep ' is newer$' | sed -e 's/ is newer$//'
Ou se você for usá-lo de forma interativa, o --progress
sinalizador pode ser muito útil.
Responder2
Não acho que exista uma maneira de fazer cp
isso diretamente, mas isso deve fazer essencialmente a mesma coisa:
cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); print $1 } END { if (NR == 0) print "NOFILES" }' | xargs -I{} find . ! -name {} -maxdepth 1
Esta pequena frase vem com algumas limitações:
1) Depende de não haver arquivos com o nome "NOFILES". Você pode alterar essa string no awk
comando para atender às suas necessidades.
2) Você deve estar no diretório onde file
existe. Se você não estiver nesse diretório, será necessário alterar o find
comando para ser find dirWhereFileExists
em vez de find .
Se você não estiver copiando de um único diretório, poderá usá-lo find dir1 dir2...
.
3) Não funcionará se, por algum motivo, você tiver crases ou aspas simples em seus nomes de arquivos.
Como você pode ver, esta não é a solução mais robusta, mas deve servir para uma operação única.
EDITAR
Acordei esta manhã e percebi que a solução acima era lixo. Se você tentasse copiar vários arquivos, ele pesquisaria tantas vezes quantos fossem os arquivos, excluindo um arquivo de cada vez. A seguinte solução, no entanto, deve funcionar:
cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); regex = $1 "|" regex } END { if (NR == 0) { regex = "NOFILES|" } print ".*/("substr(regex, 0, length(regex))")" }' | xargs -I{} find . -regextype posix-extended ! -regex {} -maxdepth 1
Ele cria um regex à medida que avança e o passa para find
ele. As mesmas limitações acima se aplicam.
Desculpe pelo peido cerebral de antes. Acho que era tarde demais para entrar no StackOverflow.
Responder3
O rsync faria o trabalho para você? Tem muitas opções que se enquadram na sua descrição, como "não sobrescrever arquivos mais recentes" e assim por diante. E você pode fazer com que ele registre as descobertas. Eu o uso frequentemente para cópia remota e local de arquivos.
Você também pode ficar muito granular com isso.
Boa sorte.