A adição do parâmetro tar '-z' (gzip) no final de 'tar -cvpfz…' não funciona como esperado

3

Eu estava usando as respostas de Copiar arquivos sem perder permissões de arquivos / pastas pergunta, quando me deparei com este comportamento interessante e inesperado.

Usar tar cvpfz target.tar.gz dir1 funciona perfeitamente e é basicamente a estrutura dos comandos listados nas respostas sugeridas para a pergunta vinculada acima.

Estranhamente, no entanto, quando adicionei o opcional - antes dos parâmetros, (por exemplo, tar -cvpfz ... , pensando que era apenas uma mudança estilística), é aí que a estranheza ocorre.

$ tar -cvpfz target.tar.gz dir1
tar: target.tar.gz: Cannot stat: No such file or directory
...
tar: Exiting with failure status due to previous errors

Mesmo estranho, embora tar -cvpfz ... exiba o erro mencionado acima, o comando realmente funciona, mas em vez de criar um arquivo compactado com gzip, ele cria um arquivo tar com o nome z (mesmo que ainda envie o erro). / p>

Se eu fizer um tar -tvf z , ele listará o conteúdo do tar corretamente. Se eu fizer um tar -ztvf z , ele diz que não é compactado.

Eu finalmente achei que mudar o comando para tar -zcvpf funciona perfeitamente. De alguma forma, colocar o parâmetro z primeiro funciona corretamente, mas colocá-lo por último (ou seja, tar -cvpfz ... ) não funciona!

man tar parece indicar que - é opcional e pode-se pensar que o comando tar deve funcionar de forma idêntica com ou sem - .

Espero que isso ajude alguém que, como eu, adicionou o - , pensando que era apenas uma diferença estilística que não mudaria o comando.

Como estou curioso e gostaria de saber mais sobre isso, alguém pode esclarecer por que isso acontece?

    
por vocadanz 27.09.2015 / 09:13

2 respostas

3

A opção -f deve ser seguida por um nome de arquivo ou dispositivo. Ao usar tar cvpfz target.tar.gz dir1 você está realmente usando o chamado "Old Option Style", onde

  

Quando as opções que precisam de argumentos são dadas junto com o comando, todos os argumentos associados seguem, na mesma ordem das opções. (página de informações do tar)

    
por user448115 27.09.2015 / 11:03
1

Muru realmente respondeu à pergunta com os links que ele postou, mas devido ao seu encorajamento, vou copiar novamente um de seus links e recapitular meus comentários aqui para, com sorte, tornar mais fácil a resposta.

De acordo com este link do StackExchange , o parâmetro f do comando tar é um pouco especial, já que requer um argumento (um nome de arquivo de arquivo) que segue imediatamente o parâmetro f , se você está precedendo seus parâmetros com - (por exemplo, tar -cf ). No entanto, como a resposta no link menciona, pode ser mais seguro apenas renunciar a - , portanto, o parâmetro f não corre o risco de tratar quaisquer parâmetros que você possa colocar após f como nome de arquivo.

Este foi o problema que eu encontrei como declarado na minha pergunta, já que eu tentei colocar o parâmetro z logo após o f (ex. tar -cvpfz ) que causou o comando tar avidamente 'consumir' o z e tratá-lo como o argumento de arquivo filename para o parâmetro f , em vez de tratar o z como simplesmente o parâmetro gzip do comando tar .

Em resumo, omitindo o - (por exemplo, usando tar cvpfz ... em vez de tar -cvpfz ..), o problema encontrado pode ser evitado. Agora eu sei porque. Obrigado, muru!

    
por vocadanz 27.09.2015 / 10:47