У меня есть различные почтовые файлы, которые содержат подпапки и не подпапки. Я хочу распаковать все zip-файлы в свою папку. Мой текущий скрипт делает то, что я хочу, если он содержит подпапки. Однако, если нет подпапки, она перечисляет их отдельно в одной папке, что будет сбивать с толку, так как мне нужно знать, что они из себя представляют.
#!/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, так как название не имеет смысла. Таким образом, конечным результатом будет эта структура после распаковки.
Обновлено: код, предоставляемый @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
[* Почему вы не должны анализировать вывод `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