Bash (unix shell脚本)解压缩多个zip文件,在zip文件名后重命名解压缩文件
我有多个类似以下示例的zip文件:Bash (unix shell脚本)解压缩多个zip文件,在zip文件名后重命名解压缩文件,bash,shell,unix,zip,unzip,Bash,Shell,Unix,Zip,Unzip,我有多个类似以下示例的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文件,并将解压后的文件重命名为
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
请帮忙!多谢各位
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
目标文件名。一些小改动:
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
脚本基本上只是将文件解压到一个新的临时目录,然后重命名新目录中的所有文件并将其移出该目录,最后删除临时目录
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