Comment utiliser 7z pour archiver tous les fichiers et répertoires (y compris ceux cachés) dans un répertoire?

10

En raison des spécificités de mes besoins d'archivage, je ne suis pas à l'aise avec les archives tar.gz solides et j'utilise plutôt 7z.

J'utilise la commande suivante pour ce faire:

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

Pour créer une archive de tout à l'intérieur en ~/my/folder/tant que ~/my/folder.7zfichier.

Mais ne ~/my/folder/.hiddenFolderrentre pas dans les archives alors. Comment régler ceci? N'est pas *censé renvoyer tous les fichiers et dossiers?

Ivan
la source
Vous utilisez l'expansion du chemin bash en dernier *, essayez de le supprimer, 7z devrait archiver tout le répertoire.
enzotib
@enzotib mais je ne veux pas le répertoire dans l'archive, seulement ce qu'il contient. Et c'est pourquoi j'ai marqué la question bash- peut-être que j'utilise "l'expansion du chemin bash" dans le mauvais sens?
Ivan

Réponses:

8

Si vous voulez le contenu d'un seul répertoire, une méthode simple consiste à y changer d'abord:

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

Ce que vous avez vu, c'est que *la liste des noms de fichiers qui ne commence pas par un .. C'est le comportement documenté, et c'est la principale raison pour laquelle les fichiers dont le nom commence par un .sont censés être cachés (l'autre est celui lsqui ne les affiche pas par défaut).

Il n'existe aucun moyen portable vraiment pratique de répertorier tous les fichiers d'un répertoire. Vous pouvez utiliser

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

mais s'il n'y a pas de fichier correspondant à l'un des modèles, le modèle restera non développé. En bash, vous pouvez définir l' dotgloboption pour éviter de traiter .spécialement un interligne ( .et ..sont toujours exclus des correspondances):

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

Dans ksh, ou dans bash si vous définissez l' extgloboption (ou dans zsh si vous définissez l' ksh_globoption), vous pouvez écrire un modèle qui correspond à tous les fichiers sauf .et ..:

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

Dans zsh, il y a une façon plus simple de dire que cela .ne doit pas être traité spécialement dans un modèle:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*(D)
Gilles 'SO- arrête d'être méchant'
la source
9

TL; DR

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

Plus d'exemples

Exemple de structure de répertoire

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

0 directories, 2 files

Essayez les commandes suivantes

  1. Dossier racine avec tout son contenu.

    7za a test1_a.7z ~/test1/

    donne

        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. Pas de dossier racine et pas de fichiers cachés

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

    donne

       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. Pas de dossier racine mais des fichiers cachés sont inclus (c'est ce que nous voulons habituellement)

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

    donne

       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
    
toujours
la source
Oui, je viens de tester cela et c'est beaucoup plus propre que d'utiliser shopt.
le
Meilleure réponse ici. Je vous remercie.
Marcin
4

Non, *n'est pas censé renvoyer tous les fichiers. Il ne renvoie que les visibles.

La solution la plus simple est:

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