ฉันมีไฟล์ซิปต่าง ๆ ที่มีโฟลเดอร์ย่อยและไม่มีโฟลเดอร์ย่อย ฉันต้องการแยก 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 เนื่องจากชื่อไม่สมเหตุสมผล ดังนั้นผลลัพธ์สุดท้ายจะเป็นโครงสร้างนี้หลังจากการขยายไฟล์
โครงสร้างโฟลเดอร์ unzip ขั้นสุดท้ายที่คาดหวัง :
- 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
ls
ทำไมคุณไม่ควรแยกการส่งออกของ