Como usar o 7z para arquivar todos os arquivos e diretórios (incluindo os ocultos) em um diretório?

6

Devido a especificidades das minhas necessidades de arquivamento, não me sinto confortável com arquivos tar.gz sólidos e uso o 7z em seu lugar.

Eu uso o seguinte comando para fazer isso:

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

Para criar um arquivo de tudo dentro de ~/my/folder/ como o arquivo ~/my/folder.7z .

Mas ~/my/folder/.hiddenFolder não entra no arquivo. Como consertar isto? O * não deveria retornar todos os arquivos e pastas?

    
por Ivan 02.11.2011 / 23:41

3 respostas

7

Se você quiser o conteúdo de um único diretório, um método fácil é alterá-lo primeiro:

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

O que você viu é que * se expande para a lista de nomes de arquivos que não começam com . . Esse é o comportamento documentado, e é a principal razão pela qual os arquivos cujo nome começa com . estão ocultos (o outro é que ls não os mostra por padrão).

Não há nenhuma maneira portátil realmente conveniente de listar todos os arquivos em um diretório. Você pode usar

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

mas se não houver um arquivo que corresponda a um dos padrões, o padrão permanecerá não expandido. No bash, você pode definir a opção dotglob para evitar tratar especialmente . ( . e .. ainda estão excluídos das correspondências):

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

Em ksh, ou no bash se você definir a opção extglob (ou em zsh se definir a opção ksh_glob ), poderá gravar um padrão que corresponda a todos os arquivos, exceto . e .. :

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

No zsh, há uma maneira mais simples de dizer que . não deve ser tratado especialmente em um padrão:

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

Não, * não deve retornar todos os arquivos. Retorna apenas os visíveis.

A solução mais fácil é:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
    
por 03.11.2011 / 00:47
3

TL; DR

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

Mais exemplos

Exemplo de estrutura de diretório

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

0 directories, 2 files

Tente seguir os comandos

  1. Pasta raiz com todo o seu conteúdo.

    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. Nenhuma pasta raiz e nenhum arquivo oculto

    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. Nenhuma pasta raiz, mas arquivos ocultos são incluídos (é o que normalmente queremos)

    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
    
por 06.08.2017 / 09:42