用于解压缩多个文件的 Bash 脚本

用于解压缩多个文件的 Bash 脚本

我有各种包含子文件夹和不包含子文件夹的 zip 文件。我希望将所有 zip 文件解压到其文件夹中。如果包含子文件夹,我当前的脚本会执行我想要的操作。但是,如果没有子文件夹,它会在同一文件夹中单独列出它们,这会令人困惑,因为我需要知道它们是什么。

解压前的文件夹结构

JCB-1.zip

- JCB  
   - KDY231-8000018  
      -> file1.txt, file2.txt  
   - KGC30-0152537  
      -> file1.txt, file2.txt  
   - S330V-0034006  
      -> file1.txt, file2.txt  

XZC605-0002319.zip

   - file_1.txt ,file_2.txt, file_3.txt

ZNE10-7845839.zip

- ZNE10-7845839  
  -> file1.txt, file2.txt  

解压后的文件夹结构

- KDY231-8000018  
- KGC30-0152537  
- S330V-0034006  
- file_1.txt  
- file_2.txt  
- file_3.txt  

当前脚本

#!/bin/bash

ZIPDIR=/mnt/www/log/_tmp
TMP=/tmp/zipfiles

cd $ZIPDIR
rm tmp/zipfiles 2>/dev/null

ls -l *.zip
if [ $? -eq 0 ]
then
  echo ".zip file found"

ls -1 $ZIPDIR/*.zip > $TMP

for i in `cat $TMP`
do
  unzip -o $i && rm $i
done
fi;

# Removing top level folder
mv $ZIPDIR/JCB/* . && rm -R JCB

if [ $? -eq 1 ]
then
  echo "NOT found"
fi;

我的想法是,对于没有子文件夹的 zip,我需要从 fileName.zip 创建它们,而不是从 file_1.txt 创建它们,因为名称没有意义。因此,解压后的最终结果将是这种结构。

最终预期解压文件夹结构

- KDY231-8000018  
- KGC30-0152537  
- S330V-0034006  
- XZC605-0002319  

已更新:@confetti 提供的代码有效。谢谢。我忘了提到另一个 zip 文件结构,我已将其包含在上方。这是我编辑后的最终代码。它可能不是高效的代码,但对我来说似乎有效。

#!/bin/bash

zipdir=/mnt/www/log/_tmp
cd $zipdir

for i in *.zip; do
    folder=${i::-4}
        mkdir -p  $folder
    unzip -o $i -d $folder && rm $i
    subdirs=$(find $folder -type d | wc -l)
    if [[ $subdirs -eq 2 ]]; then
        mv ./$folder/* ./
        rm -r $folder
    else if [[ $subdirs -gt 1 ]]; then
        mv ./$folder/*/* ./
        rm -r $folder
    fi
    fi
done

答案1

#!/bin/bash
ZIPDIR=/mnt/www/log/_tmp
TMP=/tmp/zipfiles
cd "$ZIPDIR"
rm tmp/zipfiles 2>/dev/null

for i in ./*.zip; do
    folder=${i::-4}
    mkdir "$folder"
    unzip -o "$i" -d "$folder" && rm "$i"
    subdirs=$(find "$folder" -type d -printf ".\n" | wc -l)
    if [[ $subdirs -gt 1 ]]; then
        mv ./$folder/*/* ./
        rm -r "$folder"
    fi
done

使用与您显示的结构类似的文件对其进行了测试,对我来说效果很好。

相关内容