web-dev-qa-db-ja.com

Zipファイルから抽出されたファイルの名前を、Zipファイル自体の名前として変更します。

1つのフォルダーに多くの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ファイルに複数のサブディレクトリがある場合はどうなりますか? 「Zipファイルのフォルダー内のフォルダー」を7zまたは他のユーティリティで再帰的にチェックするにはどうすればよいですか?

ZIPファイル:

| ---- Folder_1

| ------------ Folder_2

| -------------------- Contents_to_extract

Contents_to_extract>ファイル名の変更> Zip_file

1
dearN

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

私は解決策を見つけました。 @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ファイル内に論理的な問題がある可能性があります。

0
dearN