Bash скрипт для распаковки нескольких файлов

582
ducsu

У меня есть различные почтовые файлы, которые содержат подпапки и не подпапки. Я хочу распаковать все 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=$ 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
[* Почему вы не должны анализировать вывод `ls` *] (https://mywiki.wooledge.org/ParsingLs). Kamil Maciorowski 5 лет назад 0

1 ответ на вопрос

0
confetti
#!/bin/bash ZIPDIR=/mnt/www/log/_tmp TMP=/tmp/zipfiles cd "$ZIPDIR" rm tmp/zipfiles 2>/dev/null  for i in ./*.zip; do folder=$ 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: строка 13: [[: JCB-6 JCB-6 / JCB JCB-6 / JCB / NCP51-0284052: синтаксическая ошибка в выражении ( токен ошибки: «JCB-6 / JCB JCB-6 / JCB / NCP51-0284052») `** XZC605-0002319.zip <- нет подпапки **` ./batchUnzip.sh: строка 13: [[: XZC605- 0002319: слишком большое значение для базы (токен ошибки "0002319") ` ducsu 5 лет назад 0
Моя вина. Я забыл `| wc -l` за командой find, чтобы получить фактический номер подкаталогов. Я отредактировал свой ответ. Это было в основном сравнение списка строк подкаталогов с числом ранее. EOPS. confetti 5 лет назад 0
Спасибо, что нашли время, помогая. У вас была возможность протестировать код? Пока ошибка исчезла, она дает мне странные результаты. ducsu 5 лет назад 0
Проверьте это сейчас. Я пропустил `./$ folder / *` в команде `mv` внизу. По сути, пытаясь переместить папку в себя, ойс. Я попробовал текущий код, и он работает для меня. confetti 5 лет назад 0