我有多个zip文件,如下例所示:
759198298412.zip
----i love you.pdf
----forever and one.txt
----today and tomorrow.docs
48891721241592__5123.zip
----whatever it is.pdf
5717273_616.zip
----igotit.txt
----thank you very much.mp3
我正在尝试创建一个解压缩zip文件的脚本,并将解压缩的文件重命名为zip文件名。喜欢这个输出:
759198298412.pdf
759198298412.txt
759198298412.docs
48891721241592__5123.pdf
5717273_616.txt
5717273_616mp3
我在下面找到了这个脚本,但它对我不起作用,因为我的文件有空间,我在zip文件中有多个文件。
for i in *.zip
do
n=$(unzip -lqq $i | awk '{print $NF}')
e=${n#*.}
unzip $i && mv $n ${i%%_*}".$e"
done
请帮忙!谢谢
答案 0 :(得分:5)
for i in *.zip; do
mkdir "$i-dir"
cd "$i-dir"
unzip "../$i"
for j in *; do
mv "$j" "$i.${j##*.}"
done
cd ..
done
如果丢弃文件名中第一个下划线后的所有内容比mv行重要,那么:
mv "$j" "${i%%_*}.${j##*.}"
即使zip文件名中没有下划线,也要放弃工作:
i=${i%.zip}; mv "$j" "${i%%_*}.${j##*.}"
并将顶级目录前缀../
中的文件全部保存到mv
目标文件名。
答案 1 :(得分:1)
一些小改动:
unzip -Z -1
获取档案中的文件列表,以避免使用awk(仅使用空格打印名称的最后部分)。unzip -Z -1
逐行拆分记录,我们将IFS设置为'\ n',以便正确分割记录。新脚本是:
IFS=$'\n'
for i in *.zip
do
for n in $(unzip -Z -1 "$i"); do
echo "$i - $n"
e=${n#*.}
unzip "$i" "$n" && mv "$n" ${i%%.*}".$e"
done
done
请注意,此脚本假设您的zip中只有一个文件扩展名。如果不是这样,您将需要以某种方式处理重复文件。
跑步后的输出:
48891721241592__5123.pdf
48891721241592__5123.zip
759198298412.docs
759198298412.pdf
759198298412.txt
759198298412.zip
答案 2 :(得分:1)
for zip in *.zip; do
zip_filename="${zip%%.*}"
unzip "${zip}" -d "${zip_filename}-dir"
for file in "${zip_filename}-dir"/*.*; do
extension="${file##*.}"
new_name="${zip_filename}.${extension}"
mv "${file}" "${new_name}"
done
rmdir "${zip_filename}-dir"
# delete the zip file
# rm "${zip}"
done
该脚本基本上只是将文件解压缩到一个新的临时目录,然后重命名新目录中的所有文件并将它们移出目录,最后删除临时目录。