为目录中的每个zip文件创建一个专用文件夹并解压缩zip文件

cre*_*Dev 48 linux shell awk sed unzip

如果我选择一个zip文件并右键单击"在此处提取",则会创建一个包含zip文件名的文件夹,并将zip文件的整个内容提取到其中.

但是,我想通过shell转换几个zip文件.但是,当我这样做

unzip filename.zip
Run Code Online (Sandbox Code Playgroud)

该文件夹"filename"未创建,但所有文件都被解压缩到当前目录中.

我查看了参数,但没有这样的参数.我也试过了

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done
Run Code Online (Sandbox Code Playgroud)

.zip必须使用sed删除2. $ zipfile和4. $ zipfile 的扩展名.如果我做

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 
Run Code Online (Sandbox Code Playgroud)

它不起作用.

如何正确更换.zip扩展名$zipfile

有没有比shell脚本更简单的方法?

Ken*_*ent 86

unzip file.zip -d xxx将文件提取到目录xxx,如果不存在则将创建xxx.您可以查看手册页以获取详细信息.

下面的awk行应该完成这项工作:

ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh
Run Code Online (Sandbox Code Playgroud)

见下面的测试,

请注意我最后删除|sh了,因为我的拉链是伪档案; 我只想在这里显示生成的命令行.

kent$  ls -l
total 0
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip

kent$  ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'
unzip 001.zip -d 001
unzip 002.zip -d 002
unzip 003.zip -d 003
unzip 004.zip -d 004
unzip 005.zip -d 005
unzip 006.zip -d 006
unzip 007.zip -d 007
Run Code Online (Sandbox Code Playgroud)

  • 这个命令很棒,但如果文件名中有空格,它将不起作用.要考虑空格,你需要执行```ls*.zip | awk -F'.zip''{print"unzip \""$ 0"\" - d \""$ 1"\""}'| sh``` (6认同)
  • @jack我将".zip"定义为FS(字段分隔符).所以001.zip将分为两部分"001"和"".$ 1是第一场.并且$ 0是整行,在这种情况下,在awk中为"001.zip",该字段从1开始计数,而不是0. (4认同)
  • 一个不应该解析ls输出.无法在我的系统上运行,因为默认情况下ls启用了-lah.ls是一个互动工具.使用路径名扩展. (3认同)
  • 但是如果xxx是嵌套目录路径,它将失败并发出"无法创建提取目录"消息.当然我可以编写一个shell并检查中间目录是否存在,然后提前创建它)但我希望一次只使用unzip命令. (2认同)

Poi*_*ars 46

"在这里提取"只是unzip你正在使用的任何包装器的一个特征. unzip只会提取存档中的实际内容.可能没有比shell脚本更简单的方法.但是sed,awk如果您有符合POSIX标准的shell ,则不需要等等:

for f in *.zip; do unzip -d "${f%*.zip}" "$f"; done
Run Code Online (Sandbox Code Playgroud)

(你不能逃避*或不会发生路径名扩展.)请注意,如果ZIP存档包含一个目录,例如Eclipse存档(总是包含eclipse/),那么./eclipse*/eclipse/eclipse.ini在任何情况下都会最终结束.echo之前添加unzip干运行.

  • @jack,这个答案应该是接受的答案.你不应该为任何事情使用`ls`输出.`ls`是一种交互式查看目录元数据的工具.任何使用代码解析`ls`输出的尝试都会被破坏.Globs更加简单和正确:`for file in*.zip`.阅读[Parsing ls](http://mywiki.wooledge.org/ParsingLs) (2认同)

Fra*_*lle 8

如果你有p7zip,安装了7zip的命令行版本,那么你可以使用:

7z x '*.zip' -o'*'
Run Code Online (Sandbox Code Playgroud)


小智 7

在切换后添加文件夹名称和斜杠,例如:

unzip -d newfolder/ zipfile.zip
Run Code Online (Sandbox Code Playgroud)

zip将创建文件夹“ newfolder”,并将存档提取到其中。

请注意,结尾的斜杠不是必需的,但是我想它只是出于旧习惯(我使用Debian和Ubuntu)。