Sobre o tar
comando
Introdução
Tendo por exemplo:
source
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
Se é criado o numbers.tar.gz
arquivo através do tar -czf numbers.tar.gz numbers
comando, pois agora temos:
source
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
Considere se o mv numbers.tar.gz target
comando é executado, portanto temos:
target
numbers.tar.gz
Se o tar -xzf numbers.tar.gz
comando for executado, portanto, temos
target
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
Portanto, como visão geral, temos:
source
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
target
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222 content
003.txt # with the 333 content
Substituindo o controle
Vamos supor a seguinte atualização simples:
target
numbers.tar.gz
numbers
001.txt # with the 111 content
002.txt # with the 222222 content <--- updated
003.txt # with the 333 content
Se o tar -xzf numbers.tar.gz
comando no target
diretório for executado, portanto, o 002.txt
arquivo é substituído , portanto, seu conteúdo 222222 retorna para 222. Até aqui estou bem.
Para manter os novos dados seguros ou para evitar uma substituição não desejada, pode-se usar as opções --keep-old-files
e --skip-old-files
, de acordo com o tar(1) - Linux man page , indica:
-k, --keep-old-files
don't replace existing files when extracting, treat them as errors
--skip-old-files
don't replace existing files when extracting, silently skip over them
Portanto para a execução dos dois comandos a seguir:
tar --keep-old-files -xzf numbers.tar.gz
tar --skip-old-files -xzf numbers.tar.gz
acontece o seguinte:
- o primeiro sempre mostra a
tar: numbers/222.txt: Cannot open: File exists
mensagem de erro e os dados são mantidos em segurança (permanece com 222222) - o último não mostra nada - a exceção é se a
v
opção for usada - mostra atar: numbers/222.txt: skipping existing file
mensagem; e os dados são mantidos em segurança (permanece com 222222). Útil para fins de script.
Até aqui, está tudo bem.
Depois de fazer uma pesquisa encontrei a --keep-newer-files
opção, e de acordo novamente com a tar(1) - Linux man page , indica:
--keep-newer-files
don't replace existing files that are newer than their archive copies
Portanto para a execução do seguinte comando:
tar --keep-newer-files -xzf numbers.tar.gz
acontece o seguinte:
- aparece a
tar: Current ‘numbers/222.txt’ is newer or same age
mensagem e os dados são mantidos em segurança (permanece com 222222)
Praticamente esta --keep-newer-files
opção faz o mesmo que --skip-old-files
quase evitar a substituição, mas mostra uma mensagem diferente.
Pergunta
- Quando é obrigatório usar a
--keep-newer-files
opção dotar
comando sobre as opções--keep-old-files
e--skip-old-files
?
Eu quero saber qual é o cenário específico onde esta opção é obrigatória.
--keep-newer-files
é útil se você deseja manter as alterações feitas no destino depois que os arquivos de origem foram modificados pela última vez e substituir qualquer coisa mais antiga no destino por versões mais recentes da origem.Para ilustrar a diferença entre as duas opções, você precisa de outra informação, o timestamp de cada arquivo. Considere o seguinte:
Esses arquivos são copiados para
target
preservar seu registro de data e hora.Agora você fixa
001.txt
na fonte (observe at2
parte):Alguém também edita
002.txt
no alvo (observe at3
parte):Você cria um novo arquivo e o extrai no destino:
001.txt
e002.txt
na fonte, perdendo as alterações feitas002.txt
no destino;--keep-old-files
,001.txt
e002.txt
não são extraídos, e o destino fica com sua versão desatualizada de001.txt
;--keep-newer-files
,001.txt
é extraído e substitui o arquivo de destino existente, porque o arquivo existente é mais antigo que o arquivo no arquivo, mas002.txt
não é extraído porque o arquivo existente é mais recente que o arquivo no arquivo.