我需要压缩文件夹中的所有文件和子目录,包括以.
(点)开头的文件和子目录。
我位于一个名为 的文件夹中synthesis
,我需要压缩其下的所有文件和子目录(但不是synthesis
文件夹本身)。该synthesis
文件夹包含一个名为 的子目录.sopc_builder
,其中有一个文件。
我尝试了以下命令
zip -r synthesis.zip *
我将结果复制synthesis.zip
到另一个文件夹并在文件中列出了 zip 内容:
unzip -l synthesis.zip > filelist.txt
列表中没有 及其文件filelist.txt
。.sopc_builder
我在一些帖子上看到一些关于Linux命令的内容shopt
,但并没有真正理解它。
我使用的Linux版本是我公司的Red Hat Enterprise Linux Server 7.9。
提前致谢,格雷迪
答案1
那应该只是:
zip -r file.zip ./
显然需要尾随/
来解决一个错误,即如果-
在当前目录中调用了一个文件,它将被视为标准输入。
要将隐藏文件包含在 glob 中(但不能包含.
nor ..
),您可以使用zsh
glob *(D)
(D
for dotglob
glob 限定符),但likezip -r file.zip *(D)
会因为以下几个原因而出错:zip -r file.zip *
-
如果文件名以.开头,则会失败。--
会有帮助,但不适用于名为-
../*(D)
会更好。zip
默认情况下将其参数视为通配符(它更像是 MS-DOS 类型的程序)。因此,如果任何文件名包含通配符,尤其是[...]
,则可能会导致错误。用于-nw
禁用它,您将在传递任意文件名时使用它。
$ ls -AR
.:
'*' ... bar fifo| .foo -h '[x]'
- 'a'$'\n''b' dir/ file.zip foo link@
./dir:
-
$ rm -f file.zip; zip -r file.zip ./
zip warning: ignoring FIFO (Named Pipe) - use -FI to read: ./link
zip warning: ignoring FIFO (Named Pipe) - use -FI to read: ./fifo
adding: bar (stored 0%)
adding: [x] (stored 0%)
adding: ... (stored 0%)
adding: .foo (stored 0%)
adding: a^Jb (stored 0%)
adding: * (stored 0%)
adding: - (stored 0%)
adding: foo (stored 0%)
adding: dir/ (stored 0%)
adding: dir/- (stored 0%)
adding: -h (stored 0%)
$ rm -f file.zip; zip -nw -r file.zip ./*(D)
zip warning: ignoring FIFO (Named Pipe) - use -FI to read: ./fifo
zip warning: ignoring FIFO (Named Pipe) - use -FI to read: ./link
adding: * (stored 0%)
adding: - (stored 0%)
adding: ... (stored 0%)
adding: a^Jb (stored 0%)
adding: bar (stored 0%)
adding: dir/ (stored 0%)
adding: dir/- (stored 0%)
adding: .foo (stored 0%)
adding: foo (stored 0%)
adding: -h (stored 0%)
adding: [x] (stored 0%)
查看默认情况下如何处理符号链接和 fifo。当您想要打包文件以便在 Microsoft Windows 等其他操作系统上使用时,该zip
格式更适合使用。要创建 Unix 文件的存档,您宁愿使用tar
.
答案2
一种方法是zip
结合find
:
$ cd the/dir/you/want/to/zip
$ find . -print | zip test -@
adding: file.txt (stored 0%)
adding: .hidden/ (stored 0%)
adding: .hidden/file2.txt (stored 0%)
-@ file lists. If a file list is specified as -@ [Not on MacOS],
zip takes the list of input files from standard input instead
of from the command line. For example,
zip -@ foo
will store the files listed one per line on stdin in foo.zip.
Under Unix, this option can be used to powerful effect
in conjunction with the find (1) command.
For example, to archive all the C source files in the current directory
and its subdirectories:
find . -name "*.[ch]" -print | zip source -@
(note that the pattern must be quoted to keep the shell from expanding it).