Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: bash скрипт wget ftp качаем в папки по датам  (Прочитано 5918 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн aibolitr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
добрый время суток! нужна помощь в написании скрипта копирования файлов с фтп.

на чужом фтп-сервере в корне около 200 папок(101,102,103.....220) в каждой них файлы(1-15тыс) с произвольными названиями и одинаковым расширением, даты файлов в интервале 1.5-2 месяца.
нужно скопировать файлы(созданные за декабрь2016) из папки фтп 101 в локальную папку 2016/12/101

затруднения возникают при отборе по времени создания файлов
промерный алгоритм работы скрипта
1.подключиться к фтп -  получается
2.создать локальную папку 2016/11/101 - смогу,  можно в начале скрипта
3.получить список файлов в папке 101  - cd 101 ; lcd 2016/11/101 ; dir * list.101
4.отобрать файлы созданные в прошлом месяце, записать их в файл 101.11
5.скопировать с фтп папки 101 только ноябрьские файлы в локальную папку 2016/11/101 (только новые) - wget ftp из файла 101.11
6.создать локальную папку 2016/12/101 - смогу,  можно в начале скрипта
7.отобрать файлы созданные в текущем месяце, записать их в файл 101.12
8.скопировать с фтп папки 101 только декабрьские файлы в локальную папку 2016/12/101 (только новые) - wget ftp из файла 101.12
и повторить в цикле около200раз(101,102,103.....220)

у меня трудности с п.4
поправьте меня, если можно сделать как-то проще.

заранее спс
р.s.
знаний начинающего недостаточно


Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #1 : 29 Декабря 2016, 05:54:36 »
1. Получаем список директорий на сервере (101,102,103.....220).
2. Обрабатываем список директорий:
   1. Получаем список файлов в директории на сервере и их даты модификации.
   2. Создаем локальные поддиректории по имени директории и месяцев дат модификаций файлов.
   3. Загружаем файлы в созданые локальные поддиректории.

Получить (для парсинга) список содержимого директории:
Код: (bash) [Выделить]
LC_ALL=C wget -O - --user=user_name --password=passord ftp://ip_адрес/путь/

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #2 : 29 Декабря 2016, 14:11:56 »
1) Подключаем FTP локально https://linuxconfig.org/mount-remote-ftp-directory-host-locally-into-linux-filesystem
2)
Код: (bash) [Выделить]
find <ftp mount point> -type f -newer <file with timestamp> ! -newer <file2 with timestamp> -print0
http://unix.stackexchange.com/questions/186776/delete-files-older-than-specific-file

P.S. И для чего wget, если можно обойтись без оного. Кроме того wget умеет выкачивать файлы рекурсивно
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #3 : 29 Декабря 2016, 15:13:35 »
Как-то сравнивал загрузку через curlftpfs и wget, wget оказался быстрее раза в 1.5 и лучше обрабатывал ошибки и обрывы загрузки. Но ТС нужно сравнить чем лучше качается, и если нормально через curlftpfs тогда да, им будет проще.

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #4 : 29 Декабря 2016, 15:23:51 »
renzrv, curlftps можно использовать только для поиска файлов, что соответствуют критериям отбора файлов для скачивания, а качать уже через wget

find <ftp mount point> -type f -newer <file with timestamp> ! -newer <file2 with timestamp> -exec wget <ftp>{} -O ...

Примерно таким путем
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн aibolitr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #5 : 30 Декабря 2016, 12:13:47 »
спасибо всем, что откликнулись!
забыл сказать, хранение, копирование с последующей сортировкой(или на*борот) будет производится средствами d-link dns320l(прошивка крайняя стоковая-бедная), пока шить на альт-ф не спешу, попробую обойтись неполноценным функционалом родной прошивки(ftp,cat,grep,awk)


Оффлайн aibolitr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #6 : 02 Января 2017, 21:39:53 »
писал под чутким руководством одного знакомого гуру
сделал как смог.
на устройстве пришлось заменить прошивку на alt-f. добавил lftp. правда потом нашел как wget получать список файлов.
возвращать стоковую прошивку не стал.
пробовал еще и с curlftp(только на ноуте) тоже работает, довольно удобно...
в конце скрипта хотел сформировать временный файл с урлами, чтобы качать за одну сессию вгета... но недоделал
подскажите, что можно оптимизировать
насочинял вот такое:

Код: (bash) [Выделить]
#!/bin/bash
#LANG=en_US.utf8
FTP="$(which lftp)"
FTP_SERVER=ftp.ххх.ru
FTP_LOGIN=xxxxxxx
FTP_PASSWORD=xxxxxx

cd  /mnt/md1/Public/xxx
mkdir $(date +%Y)
cd $(date +%Y)

$FTP -e 'ls > .list ; bye;' ftp://$FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER

while read line;
do
FTP_TEL=`echo $line | awk '{print $9}'`
  if ! [ -d $FTP_TEL ]; then
     mkdir $FTP_TEL;
  fi;
echo "open $FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER" > .tmp_lftp
echo "ls $FTP_TEL > $FTP_TEL/.$FTP_TEL.list" >> .tmp_lftp
echo "exit" >> .tmp_lftp

#lftp -e 'ls $FTP_TEL > $FTP_TEL/$FTP_TEL.list ; bye;' ftp://$FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER - не смог реализовать переменные
lftp -f .tmp_lftp
rm -f .tmp_lftp

cd $FTP_TEL
  if ! [ -d $(date '+%m') ]; then
  mkdir $(date '+%m');
  fi;
cat .$FTP_TEL.list |grep ^- | grep $(date '+%h')| awk '{print $9}' > $(date '+%m')/.$FTP_TEL.$(date '+%m')

while read line; do
  if ! [ -f $(date '+%m')/$line ]; then
  wget -c -N -P $(date '+%m') ftp://$FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER/$FTP_TEL/$line ; wait ;
# echo "ftp://$FTP_SERVER/$FTP_TEL/$line" >> tmp_load ;
  fi;
#cat tmp_load
#wget -c -N -P $(date '+%m') -i tmp_load ftp://$FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER
#rm -f tmp_load
done < $(date '+%m')/.$FTP_TEL.$(date '+%m')

cd .. ;
done < .list
« Последнее редактирование: 02 Января 2017, 22:17:38 от Azure »

Оффлайн aibolitr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #7 : 05 Января 2017, 01:30:08 »
попробовал немного изменить схему закачки файлов(через список файлов), чтобы сократить количество циклов процедуры авторизации.
кто знает, сократиться ли время работы скрипта за счет только авторизации??

while read line; do
  if ! [ -f $(date '+%m')/$line ]; then
# wget -c -N -P $(date '+%m') ftp://$FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER/$FTP_TEL/$line ; wait ;
  echo "ftp://$FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER/$FTP_TEL/$line" >> .tmp_load ;
  fi;
wget -c -N -P $(date '+%m') -i .tmp_load
rm -f .tmp_load
done < $(date '+%m')/.$FTP_TEL.$(date '+%m')

cd .. ;
done < .list



« Последнее редактирование: 05 Января 2017, 01:32:56 от aibolitr »

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #8 : 05 Января 2017, 08:45:54 »
aibolitr,
Учти на будующее: c таким скриптом тему создавать правильнее в разделе для новичков.
Как видишь особого желания писать тебе скрипт и учить тебя - ни у кого нет.
Задача твоя решается проще и одним wget с парсингом без создания доп. файлов.

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #9 : 05 Января 2017, 15:39:26 »
aibolitr, сократится, но процент "сокращения" будет зависеть от объемов скачаных данных.

кроме того есть еще lftp
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн aibolitr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #10 : 08 Января 2017, 22:13:36 »
переделал еще раз, использовал lftp - качать стало веселее
всего 3 авторизации

#!/bin/bash
LANG=en_US.utf8
FTP="$(which lftp)"
FTP_SERVER=ftp.xxx.ru
FTP_LOGIN=xxx
FTP_PASSWORD=passxxx

cd  /mnt/md1/xxx
mkdir $(date +%Y)
cd $(date +%Y)

$FTP -e 'ls > .list ; bye;' ftp://$FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER
echo "open $FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER" > .tmp_lftp
while read line;
do
FTP_TEL=`echo $line | awk '{print $9}'`
  if ! [ -d $FTP_TEL ]; then
  mkdir $FTP_TEL;
  fi;
echo "ls $FTP_TEL > $FTP_TEL/.$FTP_TEL.list" >> .tmp_lftp
done < .list
echo "exit" >> .tmp_lftp
lftp -f .tmp_lftp
rm -f .tmp_lftp
#
echo "open $FTP_LOGIN:$FTP_PASSWORD@$FTP_SERVER" > .tmp
while read line;
do
FTP_TEL=`echo $line | awk '{print $9}'`
cd $FTP_TEL
  if ! [ -d $(date '+%m') ]; then
  mkdir $(date '+%m') ;
  fi;
cat .$FTP_TEL.list |grep ^- | grep $(date '+%h') | awk '{print $9}' > $(date '+%m')/.$FTP_TEL.$(date '+%m')
echo "lcd $FTP_TEL/$(date '+%m') " >> ../.tmp
while read line; do
  if ! [ -f $(date '+%m')/$line ]; then
  echo "get -c /$FTP_TEL/$line " >> ../.tmp ;
  fi;
done < $(date '+%m')/.$FTP_TEL.$(date '+%m')
echo "lcd .. " >> ../.tmp
echo "lcd .. " >> ../.tmp
cd ..
done < .list
echo "exit" >> .tmp
lftp -f .tmp
rm -f .tmp

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #11 : 08 Января 2017, 22:29:27 »
всего 3 авторизации
АЖ целых ТРИ!!! Вам же EvangelionDeath расписал всю команду…
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн aibolitr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #12 : 08 Января 2017, 22:59:13 »
ожидал помощь, советы и предложения как уменьшить или упростить код, а не зависть по кол-ву авторизаций
выбор инструментария за мной.
забыл сказать, хранение, копирование с последующей сортировкой(или на*борот) будет производится средствами d-link dns320l(прошивка крайняя стоковая-бедная), попробую обойтись неполноценным функционалом родной прошивки(ftp,cat,grep,awk)

curlftp в стоковой прошивке NAS отсутствует.
пробовал еще и с curlftp(только на ноуте) тоже работает, довольно удобно...

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #13 : 10 Января 2017, 01:11:30 »
Лови: wget + awk:
#!/bin/bash

DEST='/mnt/md1/Public/xxx'
FTP_SERVER=ftp.ххх.ru
FTP_LOGIN=xxxxxxx
FTP_PASSWORD=xxxxxx

Y=$(date '+%Y'); M=$(LC_ALL=C date '+%b')

LC_ALL=C wget -qO - --user=$FTP_LOGIN --password=$FTP_PASSWORD $FTP_SERVER \
| awk -vm=$M -vy=$Y '{if($1==y && $2==m){print gensub(/.*">(.+)\/<\/a>\s*$/, "\\1", 1)}}' \
| while read dir
do
DEST_DIR="${DEST}/${Y}/${M}/${dir}"; [ -d "$DEST_DIR" ] || mkdir -p "$DEST_DIR"
wget -qO - --user=$FTP_LOGIN --password=$FTP_PASSWORD ${FTP_SERVER}/${dir}/ \
| awk -vm=$M -vy=$Y '{if($1==y && $2==m){print gensub(/.*"(ftp:\/\/.+)">.*/, "\\1", 1)}}' \
| wget -c -N -P "$DEST_DIR" --user=$FTP_LOGIN --password=$FTP_PASSWORD -i -
done

Оффлайн aibolitr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: bash скрипт wget ftp качаем в папки по датам
« Ответ #14 : 11 Января 2017, 13:06:41 »
я пока не готов переварить такое колдовство 80-го уровня
но все равно, спасибо.
попробую разобраться

 

Страница сгенерирована за 0.022 секунд. Запросов: 22.