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

10

Devido às especificidades das minhas necessidades de arquivamento, não me sinto confortável com os sólidos arquivos tar.gz e utilizo o 7z.

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 ~/my/folder/como o ~/my/folder.7zarquivo.

Mas ~/my/folder/.hiddenFoldernão entra no arquivo então. Como consertar isto? Não *deveria retornar todos os arquivos e pastas?

Ivan
fonte
Você está usando a expansão do caminho bash por último *, tente removê-lo, o 7z deve arquivar todo o diretório.
enzotib 2/11/11
@enzotib, mas não quero o diretório no arquivo, apenas o que está dentro dele. E foi por isso que marquei a pergunta bash- talvez eu esteja usando a "expansão do caminho do bash" de uma maneira errada?
Ivan

Respostas:

8

Se você deseja 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 a .. Esse é o comportamento documentado e é o principal motivo pelo qual os arquivos cujo nome começa com a .ficam ocultos (o outro é que lsnão os mostra por padrão).

Não existe uma 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 dotglobopção para evitar o tratamento de um líder .especialmente ( .e ..ainda é excluído das correspondências):

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

No ksh, ou no bash, se você definir a extglobopção (ou no zsh, se a ksh_globopção), você pode escrever 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)
Gilles 'SO- parar de ser mau'
fonte
9

TL; DR

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

Mais exemplos

Estrutura de Diretório de Exemplo

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. Sem pasta raiz e sem arquivos ocultos

    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 estão incluídos (é o que geralmente 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
ainda
fonte
Sim, apenas testei isso e é muito mais organizado do que usar shopt.
será
Melhor resposta aqui. Obrigado.
Marcin
4

Não, *não é para 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 .
andcoz
fonte