Переименуйте файлы, как они извлекаются из zip-файла, как имя самого zip-файла

У меня много файлов zip (думаю, 100-150) в папке. Каждый zip-файл имеет несколько файлов с разными расширениями файлов. Я знаю, как написать bash для цикла, чтобы распаковать все содержимое этих файлов.

Что я хочу сделать, так это ... Используйте 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_file:

| ---- Folder_1

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

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

Contents_to_extract > измените имя файла на> zip_file

1
задан 7 December 2017 в 06:08

6 ответов

Я не думаю, что у 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
ответ дан 22 May 2018 в 15:35
  • 1
    Я попробую это. В настоящее время я обновил свой Q своей новой попыткой. Однако, что, если сам zip-файл имеет несколько папок внутри? – drN 7 December 2017 в 05:57
  • 2
    @drN Добавьте примерную структуру zip-файла и то, что вы хотите в конце этого вопроса. – muru 7 December 2017 в 05:58
  • 3
    добавила сложную файловую структуру на мой вопрос. tjhanks. – drN 7 December 2017 в 06:00
  • 4
    @drN "и то, что вы хотите в конце этого слова" также – muru 7 December 2017 в 06:06
  • 5
    сделанный в меру моего английского. – drN 7 December 2017 в 06:08

я не думаю, что 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
ответ дан 18 July 2018 в 01:41

Я не думаю, что у 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
ответ дан 24 July 2018 в 17:26

Я нашел решение. Это было вызвано небольшим обсуждением комментариев, которое у меня было с @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-файлах, которые просматриваются, могут быть логические проблемы ... Я не встречал их YET.

0
ответ дан 22 May 2018 в 15:35

Я нашел решение. Это было вызвано небольшим обсуждением комментариев, которое у меня было с @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-файлах, которые просматриваются, могут быть логические проблемы ... Я не встречал их YET.

0
ответ дан 18 July 2018 в 01:41

Я нашел решение. Это было вызвано небольшим обсуждением комментариев, которое у меня было с @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-файлах, которые просматриваются, могут быть логические проблемы ... Я не встречал их YET.

0
ответ дан 24 July 2018 в 17:26

Другие вопросы по тегам:

Похожие вопросы: