web-dev-qa-db-fra.com

Qu'est-ce que signifie-à-faire dans le goudron?

Je veux m'assurer que je comprends le code suivant:

tar xvzf FILE --exclude-from=exclude.me --strip-components 1 -C DESTINATION

qui a été posté dans cette réponse .

De man tar:

--strip-components=NUMBER
Numéro de bande Composants de pointe des noms de fichiers sur l'extraction

-C, --directory=DIR
[.____] Modifier le Dir d'annuaire

Je n'ai pas compris l'explication manuelle de --strip-components.

Sur -C, J'ai compris que cela signifie quelque chose comme "mettre des composants dénudés dans un répertoire noté".

Que fait --strip-components -C moyenne?

10
user149572

Le fragment de Manpage que vous avez inclus dans votre question vient de l'homme pour GNU goudron. GNU est un projet logiciel qui préfère info manuels sur des manuels. En fait, Tar Manpage a été ajouté à l'arborescence de la source de goudron GNU uniquement en 2014 et il n'est toujours pas une référence, pas un manuel complet avec des exemples. Vous pouvez appeler un manuel complet avec info tar, il est également disponible en ligne ici . Il contient plusieurs exemples d'utilisation --strip-components, les fragments pertinents sont:

--strip-components=number

Strip indiqué Nombre de composants principaux des noms de fichier avant l'extraction.

Par exemple, si archive `archive.tar 'contenait` certains/fichier/nom', puis en cours d'exécution

tar --extract --file archive.tar --strip-components=2

extraire ce fichier dans le fichier "NOM".

et:

--strip-components=number

Strip indiqué Nombre de composants principaux des noms de fichier avant l'extraction.

Par exemple, supposons que vous ayez archivé une hiérarchie totale `/ usr 'à une archive de goudron nommée` usr.tar'. Parmi d'autres fichiers, cette archive contient `usr/include/stdlib.h ', que vous souhaitez extraire dans le répertoire de travail actuel. Pour ce faire, vous tapez:

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

L'option `--Strip = 2 'indique le goudron de dénicher les deux composants principaux (` usr /' et `Inclure/') hors du nom du fichier.


qui a dit;

Il existe d'autres implémentations de goudron, par exemple FreeBSD Tar Manpage a une explication différente de cette commande:

--strip-components count

Supprimez le nombre spécifié d'éléments de chemin de tête. Les chemins de chemin avec moins d'éléments seront ignorés silencieusement. Notez que le chemin est édité après vérification des modèles d'inclusion/d'exclusion, mais avant les contrôles de sécurité.

En d'autres termes, vous devez comprendre un chemin UNIX en tant que séquence d'éléments séparés par / (sauf s'il n'y a qu'un /).

Voici mon exemple (D'autres exemples sont disponibles dans le manuel d'information que j'ai identifié ci-dessus):

Créons une nouvelle structure de répertoire:

mkdir -p a/b/c

Chemin a/b/c est composé de 3 éléments: a, b et c.

Créez un fichier vide dans ce répertoire et mettez-le dans Archive .tar:

$ touch a/b/c/FILE
$ tar -cf archive.tar a/b/c/FILE

FILE est un 4ème élément de a/b/c/FILE chemin.

Liste des contenus d'archive.tar:

$ tar tf archive.tar
a/b/c/FILE

Vous pouvez maintenant extraire des archives.tar avec --strip-components et un argument qui lui indiquera combien d'éléments de chemin que vous souhaitez supprimer du a/b/c/FILE lorsqu'il est extrait. Supprimez un répertoire d'origine a:

rm -r a

Extrait avec --strip-components=1 - Seulement a n'a pas été recréé:

$ tar xf archive.tar --strip-components=1
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 3 ja users  4096 Mar 26 15:43 b
$ tree b
b
└── c
    └── FILE

1 directory, 1 file

Avec --strip-components=2 Vous voyez que a/b - 2 éléments n'ont pas été recréés:

$ rm -r b
$ tar xf archive.tar --strip-components=2
$ ls -Al
total 16
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
drwxr-xr-x 2 ja users  4096 Mar 26 15:46 c
$ tree c
c
└── FILE

0 directories, 1 file

Avec --strip-components=3 3 éléments a/b/c n'ont pas été recréé et nous avons eu FILE dans le même répertoire de niveau dans lequel nous exécutons tar:

$ rm -r c
$ tar xf archive.tar --strip-components=3
$ ls -Al
total 12
-rw-r--r-- 1 ja users     0 Mar 26 15:39 FILE
-rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar

-C L'option indique le goudron de passer à un répertoire donné avant d'exécuter une opération demandée, extraire mais aussi l'archivage. Dans ce commentaire Vous avez demandé:

Demander le goudron de faire CD: Pourquoi CD? Je veux demander pourquoi ce n'est pas seulement MV?

Pourquoi pensez-vous que mv est meilleur? Dans quel répertoire souhaitez-vous extraire d'abord des archives de goudron:

  • / TMP - Et si c'est manquant ou complet?

  • "$ TMPDIR" - Et si c'est non défini, manquant ou complet?

  • répertoire actuel - Et si l'utilisateur n'a pas w autorisation, juste r et x?

  • et si un répertoire temporaire, quoi qu'il s'agisse déjà de fichiers contenus avec les mêmes noms que dans tar archive et extraire les écraserait?

  • que se passe-t-il si un répertoire temporaire, tout ce qu'il est ne pas prendre en charge des systèmes de fichiers UNIX et toutes les infos sur la propriété, les bits exécutables, etc. seraient perdus?

Notez également que -C est une option courante change directory dans d'autres programmes également, GIT et make sont d'abord qui me viennent à l'esprit.

4
Arkadiusz Drabczyk

Les --strip-components L'option est destinée à modifier les noms de fichiers de fichiers extraits. --strip-components <N> signifie "supprimer le premier <N> composants du nom de fichier ", où" composants "fait référence à des parties du trajet séparées par /.

Si vous avez un nom de fichier foo/bar/baz, alors avec --strip-components 1 Le fichier extrait serait nommé bar/baz.


Les -C option signifie simplement "modifier le répertoire". Si tu utilises -C /some/other/place Vous demandez efficacement tar à cd /some/other/place Avant d'extraire des fichiers. Cela signifie généralement que les fichiers seraient extraits par rapport à /some/other/place.

9
larsks

Je ne suis pas sûr de ce que je peux dire par explication qui n'a pas été couvert par les autres réponses. Au lieu de cela, je vais essayer de vous aider avec des exemples.

Arkadiusz drabczyk donne l'exemple de le manuel GNU gare où votre archive comprend un gros arborescence (par exemple, tout /usr) :

$ tar -cf usr.tar  /usr

et vous souhaitez explorer dans les archives et extraire un fichier d'un sous-répertoire de bas niveau:

$ tar -xf usr.tar --strip=2 usr/include/stdlib.h

Ce que le manuel n'arrive pas, c'est que si vous dites

$ tar -xf usr.tar           usr/include/stdlib.h

alors tar _ créera un répertoire usr dans le répertoire actuel et un sous-répertoire include dans usr, puis extrayez stdlib.h dans ./usr/include. Si c'est le résultat que vous voulez, alors bien; Utilisez cette commande. Mais si vous voulez stdlib.h Dans le répertoire actuel, vous devrez

$ mv usr/include/stdlib.h .

puis probablement rmdir -p usr/include. C'est faisable, mais c'est fastidieux. --strip=2 Vous sauve beaucoup de dactylographie.


-C Peut également être utilisé avec l'option c (minuscule c) (création d'une archive), ce qui pourrait être plus facile à comprendre. Supposons que John, Kate, Larry et Mary collaborent à la rédaction d'un livre; Ils écrivent des chapitres 1, 2, 3 et 4, respectivement. John et Kate (uniquement) utilisent le même ordinateur et ils souhaitent archiver ce qu'ils ont fait jusqu'à présent pour envoyer aux autres auteurs. Vous pouvez faire l'un des éléments suivants:

(cD à un répertoire approprié)
 $ tar cf chap12.tar/home/john/chap1/home/kate/chap2
$ cd /home
$ tar cf /tmp/chap12.tar john/chap1 kate/chap2

Mais ceux-ci créent une archive qui coode le john/ Et kate/ Chemins de répertoire. Si vous faites cela, ce serait une raison pour Larry et Mary d'utiliser --strip=2 Ou --strip=1 Quand ils extraient l'archive. Si vous souhaitez les enregistrer, cela dérangeait (et/ou gardez vos noms hors de l'archive; par exemple, pour des raisons de confidentialité), vous pouvez alors

(cD à un répertoire approprié)[.____] € tar cf chap12.tar -c/home/john chap1 -c/home/kate chap2

et ensuite, l'archive montrera juste le chap1 et chap2.