Wie archiviere ich mit 7z alle Dateien und Verzeichnisse (einschließlich versteckter) in einem Verzeichnis?

10

Aufgrund der Besonderheiten meiner Archivierungsanforderungen bin ich mit soliden tar.gz-Archiven nicht vertraut und verwende stattdessen 7z.

Ich benutze dazu den folgenden Befehl:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

So erstellen Sie ein Archiv von allem, was sich darin befindet, ~/my/folder/als ~/my/folder.7zDatei.

Aber ~/my/folder/.hiddenFolderdoesm't get in das Archiv dann. Wie kann ich das beheben? Soll nicht *alle Dateien und Ordner zurückgeben?

Ivan
quelle
Wenn Sie die Bash-Pfaderweiterung bis zum letzten verwenden *, versuchen Sie, sie zu entfernen. 7z sollte das gesamte Verzeichnis archivieren.
Enzotib
@enzotib, aber ich möchte nicht das Verzeichnis im Archiv, sondern nur das, was darin enthalten ist. Und deshalb habe ich die Frage markiert für bash- vielleicht verwende ich "Bash Path Expansion" falsch?
Ivan

Antworten:

8

Wenn Sie den Inhalt eines einzelnen Verzeichnisses möchten, können Sie es zunächst einfach ändern:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .

Was Sie gesehen haben, ist, dass *die Liste der Namen von Dateien erweitert wird, die nicht mit a beginnen .. Dies ist das dokumentierte Verhalten und der Hauptgrund, warum Dateien, deren Name mit a beginnt ., als ausgeblendet gelten (das andere ist, dass lssie standardmäßig nicht angezeigt werden).

Es gibt keine wirklich bequeme Möglichkeit, alle Dateien in einem Verzeichnis aufzulisten. Sie können verwenden

~/my/folder/..?* ~/my/folder/.[!.]* ~/my/folder/*

Wenn jedoch keine Datei vorhanden ist, die mit einem der Muster übereinstimmt, bleibt das Muster nicht erweitert. In Bash können Sie die dotglobOption festlegen , um zu vermeiden, dass ein führender .Spieler speziell behandelt wird ( .und ..weiterhin von den Spielen ausgeschlossen sind):

shopt -s dotglob
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

In ksh oder in bash, wenn Sie die extglobOption festlegen (oder in zsh, wenn Sie die ksh_globOption festlegen ), können Sie ein Muster schreiben, das mit allen Dateien außer .und übereinstimmt ..:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/@(..?*|.[!.]*|*)

In zsh gibt es eine einfachere Art zu sagen, .die nicht speziell in einem Muster behandelt werden darf:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*(D)
Gilles 'SO - hör auf böse zu sein'
quelle
9

TL; DR

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/.

Mehr Beispiele

Beispiel Verzeichnisstruktur

test1
├── .hidden
└── normal.txt

0 directories, 2 files

Versuchen Sie die folgenden Befehle

  1. Stammordner mit seinem gesamten Inhalt.

    7za a test1_a.7z ~/test1/

    gibt

        Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 D....            0            0  test1
    2017-08-06 09:23:44 ....A            0            0  test1/.hidden
    2017-08-06 09:23:51 ....A            0            0  test1/normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files, 1 folders
  2. Kein Stammordner und keine versteckten Dateien

    7za a test1_b.7z ~/test1/*

    gibt

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  1 files
  3. Kein Stammordner, aber versteckte Dateien sind enthalten (es ist das, was wir normalerweise wollen)

    7za a test1_c.7z ~/test1/.

    gibt

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:44 ....A            0            0  .hidden
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files
Stil
quelle
Ja, ich habe das gerade getestet und es ist viel aufgeräumter als die Verwendung shopt.
wird
Beste Antwort hier. Vielen Dank.
Marcin
4

Nein, *soll nicht alle Dateien zurückgeben. Es werden nur sichtbare zurückgegeben.

Die einfachere Lösung ist:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
andcoz
quelle