J'ai un script qui extrait un fichier tar.gz dans un sous-répertoire mysubfolder spécifié :
mkdir mysubfolder; tar --extract --file=sourcefile.tar.gz --strip-components=1 --directory=mysubfolder;
Y a-t-il un moyen équivalent de faire cela avec un fichier zip?
Réponses:
Comme Mathias l'a dit,
unzip
cette option n'existe pas, mais un script bash à une ligne peut faire l'affaire.Le problème est que la meilleure approche dépend de la disposition de vos archives. Une solution supposant un seul répertoire de niveau supérieur échouera misérablement si le contenu se trouve directement dans la racine de l’archive (pensez
/a/foo
/b/foo
/foo
au chaos de la suppression/a
et de la suppression/b
).Et le même échec se produit avec
tar --strip-component
. Il n'y a pas de solution unique.Donc, pour effacer le répertoire racine, en supposant qu’il en existe un (et un seul ):
Assurez-vous simplement que les fichiers / répertoires de deuxième niveau ne portent pas le même nom que le parent de niveau supérieur (par exemple,
/foo/foo
). Mais/foo/bar/foo
et/foo/bar/bar
ça va. S'ils le font, ou si vous voulez simplement être en sécurité, vous pouvez utiliser un répertoire temporaire pour l'extraction:Si vous utilisez Bash, vous pouvez tester si le niveau supérieur est un seul répertoire ou non:
En parlant de Bash, vous devez activer
dotglob
pour inclure les fichiers cachés, et vous pouvez tout encapsuler dans une seule fonction pratique:Maintenant, mettez cela dans votre
~/.bashrc
ou~/.profile
et vous n'aurez plus jamais à vous en soucier. Utilisez simplement comme:(notez qu'il sera automatiquement créé
mysubfolder
pour vous s'il n'existe pas)la source
Je ne pouvais pas trouver une telle option dans les pages de manuel
unzip
, je crains donc que ce soit impossible. :(Cependant, (selon la situation), vous pouvez contourner le problème. Par exemple, si vous êtes certain que le seul répertoire de niveau supérieur du fichier zip est nommé,
foo-
suivi d'un numéro de version, vous pouvez procéder comme suit:la source
rm -rf foo-*
exprès car c'est potentiellement dangereux. Et s'il y avait déjà un dossier nomméfoo-bar
? Notez que l'extraction est effectuée dans le/tmp
dossier, qui se vide automatiquement de temps en temps.&&
: une étape donnée ne se produit que si l'étape précédente a réussi, donc la dernière (larm
) ne s'exécute que si toutes les étapes sont terminées sans erreur./tmp/some-hardcoded-folder-name
comme dossier temporaire, mais plutôt utilisermktemp
pour cela: cela garantit qu’il n’y aura pas un tel dossier existant. Vérifiez ma réponse ci-dessous.Vous pouvez utiliser
-j
pour les chemins indésirables (ne pas créer de répertoires). Ceci n'est recommandé que pour les archives à un seul niveau quelque peu communes. Les archives avec des structures de répertoire à plusieurs niveaux seront aplaties - cela pourrait même conduire à des conflits de noms pour les fichiers à extraire.De la page de manuel de unzip:
la source