web-dev-qa-db-fra.com

Extraire le contenu du dossier de l'archive 7z dans un dossier spécifique

J'ai un fichier d'archive 7z qui, au niveau "racine", contient quelques fichiers, puis un répertoire, qui contient à la fois des fichiers et des dossiers, comme ceci:

- file1.txt
- file2.txt
- my_dir
    - file3.txt
    - file4.txt
    - another_dir
        - file5.txt
        - file6.txt

J'aimerais savoir s'il existe une seule commande qui me permet d'extraire le contenu de my_dir dans un répertoire de mon choix de manière à obtenir le résultat final. :

- target_dir
    - file3.txt
    - file4.txt
    - another_dir
        - file5.txt
        - file6.txt

J'ai essayé ces commandes:

7za x -y archive.7z -o/path/to/target_dir my_dir
7za x -y archive.7z -o/path/to/target_dir 'my_dir/*'

mais les deux ont créé cette structure de répertoire:

- target_dir
    - my_dir
        - file3.txt
        - file4.txt
        - another_dir
            - file5.txt
            - file6.txt
7
Matteo Tassinari

Existe-t-il une seule commande permettant d'extraire my_dir dans un répertoire spécifié?

Oui. Utilisez l'option e au lieu de x:

7za e -y archive.7z -o/path/to/target_dir my_dir

(x est Extrait avec les chemins complets )

e (Extraire) commande

Extrait les fichiers d'une archive dans le répertoire actuel ou dans le répertoire de sortie. Le répertoire de sortie peut être spécifié par le commutateur -o (Set Output Directory).

Cette commande copie tous les fichiers extraits dans un répertoire. Si vous souhaitez extraire des fichiers avec des chemins d'accès complets, vous devez utiliser la commande x (Extraire avec des chemins d'accès complets).

Source Commande e (extraire)


Mais en fait, le dossier de l’archive contient des sous-dossiers que j’aimerais conserver

Dans ce cas, vous devez utiliser la commande d'origine (avec x), puis utiliser move pour déplacer le contenu de my_dir d'un niveau.

Quelque chose comme le fichier batch suivant (non testé):

@echo off
7za x -y archive.7z -o/path/to/target_dir my_dir
move /y my_dir\* /path/to/target_dir
rd /s my_dir
endlocal

A partir de la ligne de commande:

7za x -y archive.7z -o/path/to/target_dir my_dir && move /y my_dir\* /path/to/target_dir && rd /s my_dir

Mais j'utilise Linux!

Ensuite, les commandes à utiliser sont:

#!/bin/bash
7za x -y archive.7z -o/path/to/target_dir my_dir
mv -f my_dir/* /path/to/target_dir
rmdir my_dir

Ou:

7za x -y archive.7z -o/path/to/target_dir my_dir && mv -f my_dir/* /path/to/target_dir && rmdir my_dir

Ce qui peut probablement être simplifié par quelqu'un qui connaît bash mieux que moi.


Lectures complémentaires

9
DavidPostill