Рекурсивный список каталогов FTP в shell / bash за один сеанс (с использованием cURL или ftp) - PullRequest
6 голосов
/ 10 апреля 2010

Я пишу небольшой скрипт, который должен пройти через все папки и файлы на FTP-сервере (рекурсивно). Пока что все работает нормально с использованием cURL - но это довольно медленно, потому что cURL начинает новый сеанс для каждой команды. Таким образом, для 500 каталогов cURL преформирует 500 имен входа.

Кто-нибудь знает, могу ли я оставаться в системе с помощью cURL (это было бы моим любимым решением) или как я могу использовать ftp только с одним сеансом в сценарии оболочки?

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

Спасибо за вашу помощь!

Ответы [ 5 ]

10 голосов
/ 26 мая 2010

Команда на самом деле ncftpls -R. Он будет рекурсивно перечислять все файлы в папке ftp.

3 голосов
/ 30 октября 2014

Просто чтобы подвести итог тому, что другие уже сказали. Если вы пытаетесь написать сценарий переносимой оболочки, который работает как пакетный файл, вам необходимо использовать решение lftp, поскольку на некоторых серверах FTP может не реализовываться ls -R. Просто замените 123.456.789.100 фактическим IP-адресом ftp-сервера в следующих примерах:

$ lftp -c "open 123.456.789.100 && find -l && exit" > listing.txt

См. Страницу man lftp, перейдите в раздел find:

Список файлов в каталоге (текущий каталог по умолчанию) рекурсивно. Это может помочь с серверами без поддержки ls -R. Вы может перенаправить вывод этой команды.

Однако если у вас есть способ выяснить, реализует ли удаленный ftp-сервер надлежащую поддержку ls -lR, тогда гораздо лучшим (= более быстрым) решением будет:

$ echo ls -lR | ftp 123.456.789.100 > listing.txt

Просто для справки: если я выполняю первую команду (lftp + find), для получения полного списка требуется 0m55.384 с, а если я выполняю вторую команду (ftp + ls-R), то 0 м3.225 с. 1019 *

3 голосов
/ 29 сентября 2010

Если это возможно, попробуйте использовать скрипт lftp:

# lftp script "myscript.lftp"
open your-ftp-host
user username password
cd directory_with_subdirs_u_want_to_list
find
exit

Следующее, что вам нужно, это скрипт bash для запуска этой команды lftp и записи ее в файл:

#!/bin/bash
lftp -f myscript.lftp > myOutputFile

myOutputFile теперь содержит полный дамп каталогов.

0 голосов
/ 26 мая 2010

Вы можете подключиться к ftp-серверу таким образом, чтобы он принимал команды от stdin и записывал в stdout. Создайте два именованных канала ("fifos", man mkfifo), перенаправьте stdin и stdout команды ftp каждый на один из них. Затем вы можете писать команды в stdin-connected-fifo и читать их (например, построчно с bash's read) из stdout-fifo. Затем используйте результаты, чтобы увидеть, куда вам нужно отправить другую команду листинга (и распечатать ее или что вы хотите сделать)

Короче говоря: не то, для чего подходит bash-скриптинг :) (Пока, конечно, вы не найдете инструмент, который делает то, что вам нужно)

0 голосов
/ 11 апреля 2010

, если вы просто хотите создать список всех файлов и папок, вы можете использовать ssh. Как то так (но проверяйте документацию по правильному использованию)

$ ssh user@host "ls -R /path"
...