Bash script untuk membuka zip beberapa file

1

Saya memiliki berbagai file zip yang berisi subfolder dan tidak ada subfolder. Saya ingin mengekstrak semua zip ke foldernya. Script saya saat ini melakukan apa yang saya inginkan jika mengandung subfolder. Namun, jika tidak ada subfolder, daftar mereka secara terpisah di folder yang sama yang akan membingungkan karena saya perlu tahu apa itu.

Sebelum unzip struktur folder :

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  

Setelah unzip struktur folder :

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

Skrip saat ini

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

Pemikiran saya adalah bahwa zip yang tidak memiliki subfolder, saya perlu membuatnya dari fileName.zip dan bukan dari file_1.txt karena namanya tidak masuk akal. Dengan demikian, hasil akhir akan menjadi struktur ini setelah membuka ritsleting.

Final mengharapkan struktur folder unzip :

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

Diperbarui: Kode ini disediakan oleh @confetti works. Terima kasih. Ada struktur file zip lain yang saya lupa sebutkan dan saya telah memasukkan di atas. Ini kode terakhir dengan suntingan saya. Ini mungkin bukan kode yang efisien, tetapi sepertinya berhasil bagi saya.

#!/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
ducsu
sumber

Jawaban:

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

Mengujinya dengan file yang mirip dengan struktur yang ditampilkan dan berfungsi sempurna untuk saya.

konfeti
sumber
Saya mendapatkan kesalahan dengan file zip yang berbeda dan menyimpan 2 folder untuk beberapa orang. JCB-6.zip <- Memiliki subfolder ./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 <- Tidak ada subfolder ./batchUnzip.sh: line 13: [[: XZC605-0002319: value too great for base (error token is "0002319")
ducsu
Salahku. Saya lupa bagian | wc -lbelakang perintah find untuk mendapatkan jumlah aktual dari sub-direktori. Saya sudah mengedit jawaban saya. Itu pada dasarnya membandingkan daftar string sub-direktori ke nomor sebelumnya. Eops.
confetti
Terima kasih telah meluangkan waktu membantu. Apakah Anda mendapat kesempatan untuk menguji kode? Sementara kesalahan hilang, itu memberi saya hasil yang aneh.
ducsu
Lihat sekarang. Aku rindu ./$folder/*dalam mvperintah di bagian bawah. Intinya mencoba memindahkan folder ke dalam dirinya sendiri, eops. Saya sudah mencoba kode saat ini dan berfungsi untuk saya.
confetti