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