Answers:
您可以重新创建包括-Folder 在内的完整文件夹结构,All CRGs
也可以使用-flag为unzip-command省略ZIP文件中的所有文件夹-j
。
问题是ZIP文件是使用All CRGs
-Folder作为顶层创建的zip "All CRGs.zip" "All CRGs"
。正确的方法将是zip "All CRGs.zip" "All CRGs/*"
这将创建了里面的所有文件和文件夹的ZIP -归档All CRGs
-folder 没有周围的文件夹。
因此,通过保留文件夹结构来仅提取文件的唯一方法是这样的:
unzip "All CRGs.zip" -d data/ && mv "data/All CRGs/*" "data/" && rmdir "data/All CRGs"
它将解压缩整个文件夹,然后将文件夹的内容向上移动一级,最后删除(现在为空)“所有CRG”文件夹。
All CRGs/*
取出引号,则文件会添加到zip中,但会显示父目录。
mv
命令不会移动隐藏文件。需要额外mv "data/All CRGs/.*" "data/"
的。
由于您知道zip文件包含不需要的顶级文件夹,并且由于您知道该顶级文件夹的名称,因此您可以使用符号链接使该文件夹的所有内容显示在父文件夹中,如下所示:
ln -s . 'data/All CRGs'
unzip 'All CRGs.zip' -d data
该ln
步骤导致data/All CRGs
创建文件夹,链接到当前目录(相对于data/
),即data/
。然后,当您从中提取文件All CRGs.zip
并且unzip
命令尝试创建时data/All CRGs/file.dat
,该文件将被创建为data/./file.dat
。
可以在没有使用touch的zip文件的情况下演示此技术:
$ mkdir data
$ ln -s . data/subdir
$ touch data/subdir/foo.txt
$ ls data
foo.txt subdir
您也可以使用此技巧将某些文件或文件夹提取到备用文件夹:
ln -s /tmp data/subdir2
然后,提取到的存档中的任何内容都subdir2
将显示在/tmp
。