Bash (unix shell脚本)解压缩多个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文件,并将解压后的文件重命名为

我有多个类似以下示例的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”,以便正确分割记录
  • 替换移动到点中的下划线,以便删除zip扩展名
  • 新脚本是:

    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