wget не получает полный список каталогов

wget не получает полный список каталогов

Я искал везде и всюду и не смог найти ответ на свою проблему. Я не уверен, что это правильный форум, но надеюсь, что кто-то здесь сможет помочь.

Я использовал wget (FTP) для резервного копирования моего сайта на локальный жесткий диск, используя опцию зеркала, без проблем, до недавнего времени. Недавно каталог, содержащий изображения, достиг предела, установленного хостинг-сервисом, для того, сколько элементов может быть в списке FTP. У меня нет доступа SSL к учетной записи.

Я могу запустить скрипт на удаленном сервере, получить полный список каталогов (ls) в файле и загрузить его на свой локальный компьютер.

Можно ли скормить этот файл wget и заставить его зеркально отразить эти файлы на моем локальном диске, как это было до достижения лимита листинга? Я бы хотел, чтобы wget читал сгенерированный список и проверял измененные и добавленные файлы. Вот вопросы, на которые я не смог найти ответы:

1) Какая команда ls будет правильной для генерации необходимой информации? В настоящее время я получаю только фактические имена файлов, но я уверен, что нужно больше.

2) Будет ли wget с опцией зеркалирования работать с входным файлом или просто загрузит все файлы во входном файле без проверки измененного статуса? Я не нашел абсолютно никакой информации об этой комбинации — только об одной или другой. Я не хочу тестировать и в итоге получать полную резервную копию каталога — пустая трата полосы пропускания и времени на то, чтобы стянуть все эти данные.

решение1

Вы можете это сделать, единственная проблема — получить вывод излсчто одинаково на удаленной и на локальной машине. У моего ls есть опция --time-style=+%sкоторый показывает время последнего изменения файла в секундах с начала эпохи, которое должно совпадать на обеих машинах. Я предполагаю, что вы хотите сделать это только для одного каталога, в противном случае findбыло бы более уместно, если бы у вас была эта команда.

На удаленном компьютере выполните команду ls в нужном каталоге в файл:

cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile

На локальной машине скопируйте удаленный файл /tmp/listfileна локальный /tmp/listfile, затем используйте awkдля подавления первых 4 столбцов вывода и сортировки списка по размеру файла, дате и имени файла. (Я предполагаю, что у вас могут быть имена файлов с пробелами, отсюда и странный awk).

awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a

В зеркальном каталоге получите тот же самый листинг:

cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b

Сравните два отсортированных списка и удалите строки, которые совпадают. комм. Удалить столбцы размера и даты (и, кстати, табуляцию в начале строк в /tmp/b, а не в /tmp/a, и 2 пробела между столбцами) и удалить дубликаты имен файлов с помощьюуникальный. (Вам не нужно сортировать снова, так как повторяющиеся строки находятся рядом).

comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c

Список в /tmp/c содержит все файлы, которые являются новыми, имеют другой размер или временную метку, или были удалены. Передайте каждый из них в wget для извлечения (все еще в соответствующем каталоге).

while read file
do  rm -f "$file"
    wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c

Вам следует настроить зеркало wget так, чтобы оно больше не извлекало этот каталог.

Если вы можете find ... -printf '%9s %T+ %p\n', вы можете использовать этот метод, начиная с верхней части каталога зеркала, чтобы эффективно выполнить зеркалирование самостоятельно.

Связанный контент