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


10

由于我的存档需求的具体情况,我对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那时候就不进入存档了。如何解决这个问题?不*应该返回所有文件和文件夹吗?


最后*,您正在使用bash路径扩展,请尝试将其删除,7z应该将整个目录存档。
enzotib

@enzotib,但我不希望目录包含存档中的内容。这就是为什么我将问题标记为bash-也许我以错误的方式使用“ bash路径扩展”?
伊万

Answers:


8

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

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)

9

TL; DR

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
    

是的,只是测试了,比使用整齐shopt

最好的答案在这里。谢谢。
Marcin

4

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

较简单的解决方案是:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.