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)
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干运行.
小智 7
在切换后添加文件夹名称和斜杠,例如:
unzip -d newfolder/ zipfile.zip
Run Code Online (Sandbox Code Playgroud)
zip将创建文件夹“ newfolder”,并将存档提取到其中。
请注意,结尾的斜杠不是必需的,但是我想它只是出于旧习惯(我使用Debian和Ubuntu)。