web-dev-qa-db-fra.com

L'ajout du paramètre tar '-z' (gzip) à la fin de 'tar -cvpfz ...' ne fonctionne pas comme prévu

J'utilisais les réponses de Copier des fichiers sans perdre les autorisations de fichiers/dossiers question, lorsque j'ai rencontré ce comportement intéressant et inattendu.

Utiliser tar cvpfz target.tar.gz dir1 fonctionne parfaitement et il s’agit essentiellement de la structure des commandes répertoriées dans les réponses suggérées à la question liée ci-dessus.

Étrangement, cependant, lorsque j’ai ajouté l’option facultative - avant les paramètres, (c’est-à-dire tar -cvpfz ..., pensant qu’il s’agissait d’un simple changement de style), c’est l’étrangeté qui en découle.

$ 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

Encore plus étrange, bien que tar -cvpfz ... lève l'erreur susmentionnée, la commande fonctionne, mais au lieu de créer un fichier gzipped, elle crée un fichier tar nommé z (même si l'erreur est toujours générée).

Si je fais un tar -tvf z, le contenu du fichier tar est correctement répertorié. Si je fais un tar -ztvf z, il dit que ce n'est pas gzippé.

J'ai finalement trouvé que changer la commande en tar -zcvpf fonctionnait parfaitement. D'une manière ou d'une autre, mettre le paramètre z en premier fonctionne correctement, mais le mettre en dernier (c'est-à-dire tar -cvpfz ...) ne fonctionne pas!

man tar semble indiquer que le - est facultatif et on pourrait penser que la commande tar devrait fonctionner de manière identique avec ou sans le -.

Espérons que cela aidera quelqu'un d'autre qui, comme moi, a ajouté le -, pensant qu'il ne s'agissait que d'une différence stylistique qui ne changerait pas la commande.

Puisque je suis curieux et aimerais en apprendre davantage à ce sujet, quelqu'un peut-il expliquer pourquoi cela se produit?

4
vocadanz

L'option -f doit être suivie d'un nom de fichier ou de périphérique. Lorsque vous utilisez tar cvpfz target.tar.gz dir1, vous utilisez en réalité le "Vieux style d’option" où

Lorsque des options nécessitant des arguments sont fournies avec la commande, tous les arguments associés suivent, dans le même ordre que les options. (page d'info tar)

3
user448115

Muru a vraiment répondu à la question avec les liens qu'il a postés, mais en raison de ses encouragements, je vais recopier l'un de ses liens et récapituler mes commentaires ici pour que j'espère mieux voir la réponse.

Selon ce lien StackExchange , le paramètre f de la commande tar est quelque peu spécial, car il nécessite un argument (un nom de fichier d'archive) qui suit immédiatement le paramètre f, si vous faites précéder vos paramètres d'un - (par exemple tar -cf). Toutefois, comme l'indique la réponse dans le lien, il peut être plus sûr de simplement renoncer à -, de sorte que le paramètre f ne risque pas de traiter les paramètres que vous pouvez définir après le f en tant que nom de fichier.

C’est le problème que j’ai rencontré, comme indiqué dans ma question, car j’ai essayé de placer le paramètre z juste après le f (par exemple, tar -cvpfz), ce qui a amené la commande tar à "consommer" le z et à la traiter comme le archive nomfichier du paramètre f, plutôt que de traiter le z comme simplement le paramètre gzip de la commande tar.

En résumé, en omettant le - (par exemple, en utilisant tar cvpfz ... plutôt que tar -cvpfz ..), le problème que j'ai rencontré peut être évité. Maintenant je sais pourquoi. Merci muru!

1
vocadanz