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
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)
尝试以下命令
根文件夹及其所有内容。
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)没有根文件夹,也没有隐藏文件
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)没有根文件夹但包含隐藏文件(这是我们通常想要的)
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)如果您想要单个目录的内容,一个简单的方法是先更改为:
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)
不,*不应该返回所有文件。它只返回可见的。
更简单的解决方案是:
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)