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, так как название не имеет смысла. Таким образом, конечным результатом будет эта структура после распаковки.

Final Ожидается распаковать структуру папок:

- 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 ответ1

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

Протестировал его с файлами, похожими на вашу показанную структуру, и отлично работает для меня.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .