it-swarm.com.de

Benennen Sie die Dateien, wie sie aus der Zip-Datei extrahiert werden, als Namen der Zip-Datei selbst um

Ich habe viele Zip-Dateien (etwa 100-150) in einem Ordner. Jede Zip-Datei hat mehrere Dateien mit unterschiedlichen Dateierweiterungen. Ich weiß, wie man eine Bash for-Schleife schreibt, um den gesamten Inhalt dieser Dateien zu entpacken.

Was ich tun möchte, ist dies ... Verwenden Sie 7z (oder eine andere), um jede Zip-Datei zu entpacken, und geben Sie dem Inhalt dieser Zip-Datei den gleichen Dateinamen wie die Zip-Datei.

Das habe ich derzeit.

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

Bearbeiten 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

Das neueste Problem ist: Was ist, wenn die Zip-Datei, mit der ich arbeite, mehrere Unterverzeichnisse hat? Wie kann ich 7z oder ein anderes Dienstprogramm rekursiv nach "Ordner in Ordner in Zip-Datei" suchen lassen?

Zip-Datei:

| ---- Ordner_1

| ------------ Ordner_2

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

Contents_to_extract> Dateiname ändern in> Zip_file

1
dearN

Ich glaube nicht, dass 7z die Möglichkeit hat, Dateien beim Extrahieren umzubenennen (wie zum Beispiel tar). Sie können stattdessen in einen Ordner extrahieren und alles in diesem Ordner so umbenennen, dass es dem Dateinamen entspricht:

#! /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

Ich habe eine Lösung gefunden. Es wurde durch die kleine Kommentardiskussion, die ich mit @muru hatte, katalysiert.

Bitte lesen Sie die Kommentare im unten stehenden Bash-Skript sorgfältig durch.

#!/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

Im Moment funktioniert dies gut. Es könnten logische Probleme mit den untersuchten Zip-Dateien vorliegen ... Ich bin noch nicht auf sie gestoßen.

0
dearN