如何使用 7z 将目录中的所有文件和目录(包括隐藏的)归档?

Iva*_*van 10 bash wildcards 7z

由于我的存档需求的特殊性,我对固定的 tar.gz 存档不满意,而是使用 7z。

我使用以下命令来执行此操作:

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

要创造一切内部的档案~/my/folder/的~/my/folder.7z文件。

但是~/my/folder/.hiddenFolder没有进入档案。如何解决这个问题?不*应该返回所有文件和文件夹吗?

小智 9

TL; 博士

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/.
Run Code Online (Sandbox Code Playgroud)

更多例子

示例目录结构

test1
??? .hidden
??? normal.txt

0 directories, 2 files
Run Code Online (Sandbox Code Playgroud)

尝试以下命令

  1. 根文件夹及其所有内容。

    7za a test1_a.7z ~/test1/
    
    Run Code Online (Sandbox Code Playgroud)

    给

        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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 没有根文件夹,也没有隐藏文件

    7za a test1_b.7z ~/test1/*
    
    Run Code Online (Sandbox Code Playgroud)

    给

       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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 没有根文件夹但包含隐藏文件(这是我们通常想要的)

    7za a test1_c.7z ~/test1/.
    
    Run Code Online (Sandbox Code Playgroud)

    给

       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
    
    Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 8

如果您想要单个目录的内容,一个简单的方法是先更改为:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
Run Code Online (Sandbox Code Playgroud)

您看到的是*扩展到不以.. 这是记录在案的行为,这也是名称以 a 开头的文件.被称为隐藏的主要原因(另一个是ls默认情况下不显示它们)。

没有真正方便的便携式方法来列出目录中的所有文件。您可以使用

~/my/folder/..?* ~/my/folder/.[!.]* ~/my/folder/*
Run Code Online (Sandbox Code Playgroud)

但如果没有与其中一种模式匹配的文件,则该模式将保持未展开状态。在 bash 中,您可以设置dotglob选项以避免.特殊处理前导(.并且..仍然被排除在匹配之外):

shopt -s dotglob
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*
Run Code Online (Sandbox Code Playgroud)

在 ksh 中,或者在 bash 中,如果您设置了该extglob选项(或者在 zsh 中,如果您设置了该ksh_glob选项),您可以编写一个匹配除.and之外的所有文件的模式..:

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

在 zsh 中,有一种更简单的说法,.不能在模式中特别对待:

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


and*_*coz 5

不,*不应该返回所有文件。它只返回可见的。

更简单的解决方案是:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
Run Code Online (Sandbox Code Playgroud)