Bash script เพื่อทำการแตกไฟล์หลาย ๆ ไฟล์


1

ฉันมีไฟล์ซิปต่าง ๆ ที่มีโฟลเดอร์ย่อยและไม่มีโฟลเดอร์ย่อย ฉันต้องการแยก 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ทำไมคุณไม่ควรแยกการส่งออกของ
Kamil Maciorowski

คำตอบ:


0
#!/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

ทดสอบด้วยไฟล์ที่คล้ายกับโครงสร้างที่คุณแสดงและทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน


ฉันได้รับข้อผิดพลาดเกี่ยวกับไฟล์ zip ที่แตกต่างกันและมันมีการบันทึก 2 โฟลเดอร์สำหรับบางส่วน JCB-6.zip <- มีโฟลเดอร์ย่อย ./batchUnzip.sh: line 13: [[: JCB-6 JCB-6/JCB JCB-6/JCB/NCP51-0284052: syntax error in expression (error token is "JCB-6/JCB JCB-6/JCB/NCP51-0284052") XZC605-0002319.zip <- ไม่มีโฟลเดอร์ย่อย ./batchUnzip.sh: line 13: [[: XZC605-0002319: value too great for base (error token is "0002319")
ducsu

ความผิดของฉัน. ฉันลืม| wc -lเบื้องหลังคำสั่ง find เพื่อรับจำนวนไดเรกทอรีย่อยจริง ฉันแก้ไขคำตอบของฉันแล้ว มันเป็นการเปรียบเทียบรายการสตริงของไดเรกทอรีย่อยกับตัวเลขก่อน Eops
ลูกปา

ขอบคุณที่สละเวลาช่วย คุณมีโอกาสทดสอบรหัสหรือไม่ ในขณะที่ข้อผิดพลาดหายไปมันให้ผลลัพธ์แปลก ๆ แก่ฉัน
ducsu

ลองดูสิ ผมเคยพลาด./$folder/*ในmvคำสั่งที่ด้านล่าง eops พยายามที่จะย้ายโฟลเดอร์ไปไว้ในตัวมันเอง ฉันได้ลองใช้รหัสปัจจุบันแล้วและได้ผลกับฉัน
ลูกปา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.