Intereting Posts
Как сохранить пространство в литеральном выражении в значении массива в bash и как обрезать результаты из команды sort? Планирование команд по неактивности системы Есть ли инструмент, который может синхронизировать 2 папки на двух системах? Обработка текста и экспорт содержимого на лист Excel Как исправить E: Sub-process / usr / bin / dpkg вернул код ошибки (2)? Kali Linux никогда не загружается Может ли LVM отмечать / избегать плохих блоков? Как проверить, какая строка скрипта bash выполняется Solaris 11 nlsadm list-timezone issue Редактор Kate: как определить / добавить фильтры типов файлов в диалоговом окне файлов? Поиск лицензий на шрифты Найти конфигурацию PCI Убить все процессы, связанные с приложением Быстрый инструмент для создания миниатюрных видео галерей для командной строки Linux mint 18.1 не загружается. Показывает журнал ошибок, всегда заканчивающийся конечной трассой

Получение файла с wget, когда имя файла может немного измениться

У меня есть программа, которая берет данные из пяти правительственных источников и объединяет их в одну большую базу данных для моей компании. Я использую wget для извлечения файлов. Однако я обнаружил, что один из источников изменяет имя каждый раз, когда он обновляется.

Например, в последний раз, когда я получил файл, он был вызван myfile150727.flatfile . Сегодня, когда я пытался запустить свою программу, я получил статус выхода 8 no such file . Когда я вручную попал в ftp, я обнаружил, что файл теперь называется myfile150914.flatfile . Таким образом, очевидно, что имя файла меняется в зависимости от даты последнего обновления.

Могу ли я изменить свой сценарий, чтобы принять этот факт во внимание и все еще автоматически загружать файл?

Да, но детали зависят от того, как изменяется имя файла. Если это всегда сегодняшняя дата, просто скажите сценарию, чтобы получить это:

 filename=myfile"$(date +%y%m%d)".flatfile wget ftp://example.com/"$file" 

Или, если он не обновляется ежедневно и есть только один файл с именем myfileWHATEVER.flatfile , получите следующее:

 wget "ftp://example.com/myfile*.flatfile" 

Если у вас может быть много файлов с похожими именами, вы можете загрузить их все, а затем сохранить только самые новые:

 wget -N "ftp://example.com/myfile*.flatfile" ## Find the newest file for file in myfile*.flatfile; do [[ "$file" -nt "$newest" ]] && newest="$file"; done ## Delete the rest for file in myfile*.flatfile; do [[ "$file" != "$newest" ]] && rm "$file" done 

Кроме того, вы можете извлечь дату из имени файла:

 wget -N "ftp://example.com/myfile*.flatfile" for file in myfile*.flatfile; do fdate=$(basename "${file//myfile}" .flatfile) [[ "$fdate" -gt $(basename "${nfile//myfile}" .flatfile) ]] && nfile="$file" done for file in myfile*.flatfile; do [[ "$file" = "$nfile" ]] || rm "$file" done 

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

что-то вроде

 for site in site1.com site2.com do mkdir -p $site ftp -in <<EOF connect $site user archemar foo lcd $site cd /path/to/remote/file mget myfile*.fileflat quit EOF done 
  • замените user archemar foo вашим именем пользователя и паролем или user ftp если разрешен анонимный ftp.
  • замените cd /path/to/remote/file очевидным
  • это поместит misc * .flatfile в соответствующий каталог сайта. Если имя уникально, удалите mkdir $site и lcd $site .
  • в соответствии с процессом обновления, вы можете захотеть rm перед передачей.