多个Zip文件的解压,以Zip文件名重命名已解压的文件 (Unix Shell脚本)

3

我有多个像这个例子一样的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

我找到了下面这个脚本,但是它对我来说不起作用,因为我的文件名中有空格,并且我在一个压缩文件中有多个文件。
for i in *.zip
do 
n=$(unzip -lqq $i | awk '{print $NF}')
e=${n#*.}
unzip $i && mv $n ${i%%_*}".$e"
done    

请帮忙!谢谢。
3个回答

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##*.}"

如果要在压缩文件名中没有下划线的情况下实现该功能,请使用以下代码:

i=${i%.zip}; mv "$j" "${i%%_*}.${j##*.}"

为了将文件保留在顶级目录中,请在 mv 目标文件名前加上前缀 ../


2
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

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


1

做出了一些小改变:

  1. 引用变量以处理文件名中的空格。
  2. 使用unzip -Z -1获取归档文件中的文件列表,避免使用awk(它仅打印带有空格的名称的最后一部分)。
  3. 由于unzip -Z -1按行拆分记录,因此我们将IFS设置为'\n'以正确拆分记录。
  4. 将移动操作中的下划线替换为点,以删除.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接