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

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

由于我的归档需求的具体情况,我对固定的 tar.gz 归档感到不舒服,因此改用 7z。

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

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

~/my/folder/将其中的所有内容创建为文件存档~/my/folder.7z

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

答案1

长话短说

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

更多示例

目录结构示例

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

0 directories, 2 files

尝试以下命令

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

    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. 没有根文件夹,也没有隐藏文件

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

    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
    

答案2

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

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

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

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

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

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

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

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

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

在 zsh 中,有一种更简单的方式来表示.不得在模式中进行特殊处理:

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

答案3

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

更简单的解决方案是:

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

答案4

我使用 7z(在 Linux 中)提取了我的 zip 存档,我有一个充满 zip 的文件夹。

我用过了:

7z x *.zip -o* to extract the zip files

我需要弄清楚: 7z a {上述命令中的文件夹} -r

记住上述内容,我想使用 7z a 命令创建 7z 存档,但使用在提取部分中创建的文件夹名称。那怎么办呢?

相关内容