关于linux:创建zip文件并忽略目录结构

Create zip file and ignore directory structure

我需要使用以下命令创建一个zip文件:

1
zip /dir/to/file/newZip /data/to/zip/data.txt

这可行,但是创建的zip文件会创建一个目录结构,将目录模仿为原始文件。 我不需要很多额外的文件夹。

粗略浏览手册页或Google搜索时,我没有找到答案。


您可以使用-j

1
2
3
4
5
-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).


使用-j不能与-r选项一起使用。
因此,解决方法可以是:

1
2
3
cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

或在线版本

1
cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

如果您不希望cd -输出出现在屏幕上,则可以将输出定向到/dev/null


使用-j选项:

1
2
3
   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).

有点相关-我正在寻找一种解决方案,以对目录执行相同的操作。
不幸的是-j选项不适用于此:(

这是一个很好的解决方案:
https://superuser.com/questions/119649/avoid-unwanted-path-in-zip-file


或者,您可以创建指向文件的临时符号链接:

1
2
3
ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

这也适用于目录。


保留父目录,以便unzip不会在所有位置喷出文件

压缩目录时,将父目录保留在存档中将有助于避免稍后解压缩存档文件时乱码当前目录

因此,为了避免保留所有路径,并且由于不能同时使用-j和-r(您会得到error),因此可以执行以下操作:

1
2
3
cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

../$(basename $PWD)是保留父目录的魔力。

因此,现在unzip my.zip将提供一个包含所有文件的文件夹:

1
2
3
4
5
6
parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

而不是用解压缩的文件乱码当前目录:

1
2
3
4
5
file1
file2
dir1
├── file3
├── file4

只需使用-jrm选项删除文件和目录
结构

1
zip -jrm /path/to/file.zip /path/to/file