(unix shell脚本)解压缩多个zip文件,重命名zip文件名后的解压缩文件

时间:2014-08-21 17:24:26

标签: 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文件的脚本,并将解压缩的文件重命名为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    

请帮忙!谢谢

3 个答案:

答案 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)

一些小改动:

  1. 引用变量来处理文件名中的空格。
  2. 使用unzip -Z -1获取档案中的文件列表,以避免使用awk(仅使用空格打印名称的最后部分)。
  3. 由于unzip -Z -1逐行拆分记录,我们将IFS设置为'\ n',以便正确分割记录。
  4. 将移动中的下划线替换为点,以便删除.zip扩展名。
  5. 新脚本是:

    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

该脚本基本上只是将文件解压缩到一个新的临时目录,然后重命名新目录中的所有文件并将它们移出目录,最后删除临时目录。