我有各种包含子文件夹和不包含子文件夹的 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
使用与您显示的结构类似的文件对其进行了测试,对我来说效果很好。