有没有办法使用命令压缩给定目录中的所有文件zip
?我听说过使用*.*
,但我希望它也适用于无扩展名文件。
答案1
你可以只使用*
;没有必要*.*
。文件扩展名在 Unix 上并不特殊。*
匹配零个或多个字符——包括一个点。所以它匹配foo.png
,因为这是零个或多个字符(确切地说是七个)。
请注意,*
默认情况下不匹配以点开头的文件(也不匹配*.*
)。这通常就是您想要的。如果没有,在 bash 中,如果你shopt -s dotglob
会(但仍会排除.
和..
)。其他 shell 有不同的方式(或根本没有)包含点文件。
或者,zip
还有一个-r
(递归)选项可以一次执行整个目录树(并且不必担心点文件问题):
zip -r myfiles.zip mydir
其中mydir
是包含您的文件的目录。请注意,生成的 zip 将包含目录结构和文件。正如 peterph 在他的评论中指出的那样,这通常被视为一件好事:提取 zip 会将所有提取的文件整齐地存储在一个子目录中。
-j
您还可以使用/选项告诉 zip 不要存储路径--junk-paths
。
该zip
命令附带文档,告诉您其所有(许多)选项;键入man zip
以查看该文档。这并不是 zip 所独有的。您可以通过这种方式获取大多数命令的文档。
答案2
就我而言,我想将每个文件压缩到其自己的存档中,因此我执行了以下操作(在 中zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
答案3
另一种方法是使用 find 和 xargs: (这可能在 zip 中包含一个“.”目录,但它仍然应该正确提取。根据我的测试,zip 在压缩之前去掉了点)
find . -type f -exec zip zipfile.zip {} +
(如果您的版本不支持exec 的结尾,+
则可以替换为。不过它会更慢......)\;
find
+
默认情况下,这将包括所有子目录。在 GNU find 上-maxdepth
可以防止这种情况。
答案4
不是.zip
文件,而是gzip *
一个简短的命令,它将目录中的每个文件压缩为自己的文件.gz
并删除原始文件。在许多情况下确实很方便,因为许多其他工具可以直接处理.gz
文件。
user@computer:~/test$ touch test1.txt
user@computer:~/test$ touch test2.txt
user@computer:~/test$ touch test3.txt
user@computer:~/test$ ls
test1.txt test2.txt test3.txt
user@computer:~/test$ gzip *
user@computer:~/test$ ls
test1.txt.gz test2.txt.gz test3.txt.gz