将从 zip 文件中提取的文件重命名为 zip 文件本身的名称

将从 zip 文件中提取的文件重命名为 zip 文件本身的名称

我在一个文件夹中有很多 zip 文件(大概 100-150 个)。每个 zip 文件都有多个文件,文件扩展名也不同。我知道如何编写 bash for 循环来解压这些文件的所有内容。

我想要做的是...使用 7z(或其他)解压缩每个 zip 文件,并为该 zip 文件的内容赋予与 zip 文件相同的文件名。

这就是我目前所拥有的。

#!/bin/bash
for i in *.zip;
    do
        echo $i #For debugging purpose
        7z x $i &
    done

编辑2:

#!/bin/bash


for i in *.zip;
    do
        fbname=$(basename "$i" .zip);
        fem_fileName=$(unzip -l $i | grep .fem | awk '{print $4}')
        echo $fbname
        echo $fem_fileName
        $unzip $i
        7z e $i *.fem -y
        #echo $fbname
        #echo $fem_fileName
        mv $fem_fileName $fbname
    done

最新的问题是:如果我操作的 zip 文件有多个子目录怎么办?如何让 7z 或其他实用程序递归检查“zip 文件中文件夹中的文件夹”?

Zip文件:

|----文件夹_1

|------------文件夹_2

|--------------------要提取的内容

内容提取 > 将文件名更改为 > zip_file

答案1

我认为没有7z办法在提取时重命名文件(比如说tar有)。相反,您可以提取到一个文件夹,然后重命名该文件夹中的所有内容以匹配文件名:

#! /bin/bash

for i in *.zip;
do
    echo $i # For debugging
    filename="${i%.*}"  # get filename without .zip
    (
        7z x -o"$filename" "$i"; # extract to directory named after zip file
         cd "$filename"
         shopt -s globstar
         for i in "$filename"/**; do
             # move everything in directory to parent folder with new name
             [[ -f $i ]] || continue # only files
             mv "${i}" ../"${filename}.${i##*.}"  # but keep extension
         done
         cd ..; rm -r "$filename" # cleanup
     )&
done

答案2

我找到了一个解决方案。这是由我和@muru 的小评论讨论催化的。

请仔细阅读下面 bash 脚本中的注释。

#!/bin/bash
#''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#Checks within each .zip file in current folder
#for the presence of a .xyz or .abc file
#
#When a .xyz or .abc file is found, it extracts the latest version of it into
# ./xyzfiles or ./abcfiles AND renames these extracted .xyz or .abc files with
#the same name as the original zip file.
#
#Note that the xyzfiles and the abcfiles folder SHOULD BE FIRST CREATED!!
#
# Author: Anon
# Ver 2.0 / 7-Dec-2017
#
#''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

for i in *.zip;
    do
        xyz_exists=$(zipinfo $i | grep "xyz" | wc -l)
        abc_exists=$(zipinfo $i | grep "abc" | wc -l)
        if [ $xyz_exists != 0 ]
            then 
                #echo true
                path_to_file=($(zipinfo $i | grep "xyz" | awk '{print $9}'))  
                #echo $path_to_file    
                new_name_0=$i
                #echo $new_name_0
                new_name=$(echo "${new_name_0%.*}")
                #echo $new_name
                unzip -o -qq $i #Unzip while overwriting (-o), al done very quietly (-qq)
                mv $path_to_file ./xyzfiles/$new_name
        elif [ $abc_exists != 0 ]
            then
                #echo true
                path_to_file=($(zipinfo $i | grep "abc" | awk '{print $9}'))  
                #echo $path_to_file    
                new_name_0=$i
                #echo $new_name_0
                new_name=$(echo "${new_name_0%.*}")
                #echo $new_name
                unzip -o -qq $i #Unzip while overwriting (-o), al done very quietly (-qq)
                mv $path_to_file ./abcfiles/$new_name
        fi
    done

目前,这种方法还不错。正在检查的 zip 文件中可能存在逻辑问题...我还没有遇到过。

相关内容