Extrahieren Sie Ordnerinhalte aus dem 7z-Archiv in einen bestimmten Ordner

11

Ich habe eine 7z-Archivdatei, die auf der "Root" -Ebene einige Dateien enthält, und dann ein Verzeichnis, das wiederum sowohl Dateien als auch Ordner wie folgt enthält:

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

Ich würde gerne wissen , ob es ein einziger Befehl, den mir das extrahieren Inhalt des my_dirinnerhalb eines Verzeichnisses meiner Wahl , so dass das Endergebnis ist:

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

Ich habe diese Befehle ausprobiert:

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

aber beide haben diese Verzeichnisstruktur erstellt:

- target_dir
    - my_dir
        - file3.txt
        - file4.txt
        - another_dir
            - file5.txt
            - file6.txt
Matteo Tassinari
quelle
Funktioniert das : 7z x archive.7z my_dir -y -r -otarget_dir?
Harryc
Leider nein, das gleiche Ergebnis wie die Befehle, die ich ausprobiert habe.
Matteo Tassinari
Dann extrahieren und dann bewegen.
Harryc

Antworten:

13

Gibt es einen einzigen Befehl, mit dem my_dir in ein bestimmtes Verzeichnis extrahiert werden kann?

Ja. Verwenden Sie die eOption anstelle von x:

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

( xist Extrakt mit vollen Pfaden )

e Befehl (Extrahieren)

Extrahiert Dateien aus einem Archiv in das aktuelle Verzeichnis oder in das Ausgabeverzeichnis. Das Ausgabeverzeichnis kann mit dem Schalter -o (Set Output Directory) angegeben werden.

Dieser Befehl kopiert alle extrahierten Dateien in ein Verzeichnis. Wenn Sie Dateien mit vollständigen Pfaden extrahieren möchten, müssen Sie den Befehl x (Mit vollständigen Pfaden extrahieren) verwenden.

Quell- e-Befehl (Extrahieren)


Tatsächlich enthält der Ordner im Archiv Unterordner, die ich beibehalten möchte

In diesem Fall müssen Sie den ursprünglichen Befehl (mit x) verwenden und dann moveden Inhalt my_direiner Ebene nach oben verschieben.

So etwas wie die folgende Batch-Datei (nicht getestet):

@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

Über die Befehlszeile:

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

Aber ich benutze Linux!

Dann sind die zu verwendenden Befehle:

#!/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

Oder:

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

Was wahrscheinlich von jemandem vereinfacht werden kann, der es bashbesser weiß als ich.


Weiterführende Literatur

DavidPostill
quelle
Hallo David, danke für deine Hilfe, aber ich fürchte, ich habe meine Frage möglicherweise zu stark vereinfacht. Tatsächlich enthält der Ordner im Archiv Unterordner, die ich behalten möchte, siehe Bearbeitung.
Matteo Tassinari
@MatteoTassinari Dann müssen Sie die ursprüngliche xOption verwenden und dann moveden Inhalt my_direiner Ebene nach oben verschieben.
DavidPostill
Das habe ich befürchtet, ich habe wirklich gehofft, dass es mit einem einzigen Befehl erledigt werden kann
Matteo Tassinari
@MatteoTassinari Antwort aktualisiert mit einer vorgeschlagenen Batch-Datei.
DavidPostill
Vielen Dank für das Skript, aber mein Betriebssystem ist CentOS, nicht Windows. Deshalb habe ich das "Linux" -Tag auf die Frage gesetzt. Ich werde jedoch kein Problem damit haben, das in sein Linux-Äquivalent umzuwandeln.
Matteo Tassinari