Come usare 7z per archiviare tutti i file e le directory (inclusi quelli nascosti) in una directory?


10

A causa delle specifiche delle mie esigenze di archiviazione, non mi sento a mio agio con solidi archivi tar.gz e invece uso 7z.

Per fare questo uso il seguente comando:

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

Per creare un archivio di tutto all'interno ~/my/folder/come ~/my/folder.7zfile.

Ma ~/my/folder/.hiddenFoldernon entra nell'archivio allora. Come risolvere questo? Non *dovrebbe restituire tutti i file e le cartelle?


Per ultimo stai usando l'espansione del percorso bash *, prova a rimuoverlo, 7z dovrebbe archiviare l'intera directory.
enzotib,

@enzotib ma non voglio la directory nell'archivio, solo ciò che c'è dentro. Ed è per questo che ho taggato la domanda per bash- forse sto usando "espansione del percorso bash" in un modo sbagliato?
Ivan,

Risposte:


8

Se vuoi il contenuto di una singola directory, un metodo semplice è quello di cambiarlo prima:

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

Quello che hai visto è che si *espande all'elenco dei nomi di file che non iniziano con a .. Questo è il comportamento documentato, ed è il motivo principale per cui i file il cui nome inizia con a .vengono detti nascosti (l'altro è che lsnon li mostra per impostazione predefinita).

Non esiste un modo portatile davvero conveniente per elencare tutti i file in una directory. Puoi usare

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

ma se non esiste alcun file corrispondente a uno dei pattern, il pattern rimarrà non espanso. In bash, puoi impostare l' dotglobopzione per evitare di trattare .specialmente un leader ( .e ..sono ancora esclusi dalle partite):

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

In ksh o in bash se si imposta l' extglobopzione (o in zsh se si imposta l' ksh_globopzione), è possibile scrivere un modello che corrisponda a tutti i file tranne .e ..:

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

In zsh, c'è un modo più semplice per dire che .non deve essere trattato in modo speciale in uno schema:

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

9

TL; DR

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

Più esempi

Esempio di struttura di directory

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

0 directories, 2 files

Prova a seguire i comandi

  1. Cartella principale con tutto il suo contenuto.

    7za a test1_a.7z ~/test1/

        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. Nessuna cartella principale e nessun file nascosto

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

       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. Nessuna cartella principale ma sono inclusi i file nascosti (è quello che di solito vogliamo)

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

       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

Sì, l'ho appena testato ed è molto più ordinato dell'uso shopt.
sarà il

La migliore risposta qui. Grazie.
Marcin,

4

No, *non dovrebbe restituire tutti i file. Restituisce solo quelli visibili.

La soluzione più semplice è:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.