Я искал везде и всюду и не смог найти ответ на свою проблему. Я не уверен, что это правильный форум, но надеюсь, что кто-то здесь сможет помочь.
Я использовал 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'
, вы можете использовать этот метод, начиная с верхней части каталога зеркала, чтобы эффективно выполнить зеркалирование самостоятельно.