FTP-Download-Liste der absoluten Pfade

5

Ich habe eine Liste von (ein paar tausend) absoluten Pfaden zu Dateien auf einem Remote-Server, die ich auf meinen PC herunterladen muss.

Ich brauche auch die Dateien, um die Verzeichnisstruktur für diese Dateien intakt zu halten.

Beispiel:

/* UNIX Server File-System  */
/home/username/
    stuff/
    more-stuff/
    data/
    file1.txt

/* Local Windows File-System After Transfer  */
C:\Users\username\Documents\home\username\
    stuff\
    more-stuff\
    data\
    file1.txt

Im Idealfall würde ich eine Art FTP verwenden, um diese Dateien auf meinen PC zu übertragen. Mir ist jedoch kein Programm oder CLI-Befehl bekannt, der das Abrufen einer Dateiliste unterstützt. Ich muss bestimmte Dateien aus bestimmten Verzeichnissen herunterladen. Ich kann nicht einfach ganze Verzeichnisse herunterladen.

Meine Frage: Wie kann ich eine Liste absoluter Pfade verwenden, um die Dateien automatisch auf meinen localhost herunterzuladen? (unter Beibehaltung der Verzeichnisstruktur)

Außerdem habe ich diese Dateien in einem PHP-Array. So ist es mir möglich, die Liste als JSON, CSV, XML usw. zu exportieren.

Nicholas Summers
quelle
1
Kannst du verwenden rsync?
Hastur

Antworten:

3

Wenn Sie etwas dagegen haben, können Sie rsyncmit etwas wie verwenden

rsync -av --files-from=/path/yourlist.txt / remote:/backup

wo in

  • /path/yourlist.txt Sie können Ihre Dateiliste mit dem vollständigen Pfad einfügen
  • /Der Pfad, der dem Dateinamen in Ihrer Liste hinzugefügt werden soll (wenn es sich um einen vollständigen Pfad handelt /)
  • remote:/backup Der Name des Remote-Hosts und sein relativer Pfad

Sie können mehr Suche --files-fromaus der [ 1 ] lesenman rsync

--files-from = DATEI

Using this option allows you to specify the exact list of files to transfer (as
read from the specified FILE or - for standard input). It also tweaks the 
default  behavior of rsync to make transferring just the  specified files and 
directories  easier:
  • Die Option --relative (-R) enthält die Pfadinformationen , die für jedes Element in der Datei angegeben sind (verwenden Sie --no-relative oder --no-R, wenn Sie dies deaktivieren möchten).
  • Die Option --dirs (-d) impliziert , dass Verzeichnisse erstellt werden, die in der Liste auf dem Ziel angegeben sind, anstatt sie geräuschvoll zu überspringen (verwenden Sie --no-dirs oder --no-d, wenn Sie dies deaktivieren möchten).
  • Das Verhalten der Option - archive (-a) impliziert nicht --recursive (-r). Geben Sie sie daher explizit an, wenn Sie dies wünschen.
  • Diese Nebenwirkungen ändern den Standardstatus von rsync, sodass die Position der Option --files-from in der Befehlszeile keinen Einfluss darauf hat, wie andere Optionen analysiert werden (z. B. -a funktioniert vor oder nach --files- von, ebenso wie --no-R und alle anderen Optionen).

... in der Manpage gibt es mehr ...

Hastur
quelle
Genau das habe ich gesucht!
Nicholas Summers
Schauen Sie sich die Hilfe gut an ... es gibt viele interessante Optionen, um z. B. zu vermeiden, dass dieselben Dateien erneut heruntergeladen werden usw. usw.
Hastur
Auf jeden Fall die beste Lösung.
MariusMatutiae
5

wgethat die Funktionalität, die Sie suchen. Aus der Manpage:

-i file
       --input-file=file
           Read URLs from a local or external file.  If - is specified as file, URLs are read from the standard input.  (Use ./- to read from a file literally named -.)

Mit anderen Worten: wget -i filelist.txt.

filelist muss auch nicht unbedingt txt sein, da wget html über den --force-htmlswitch unterstützt. Wenn Sie nur eine Liste von Verzeichnissen / Dateien haben, können Sie die Basis-URL in der Befehlszeile mit dem --baseSchalter festlegen .

Jarmund
quelle
er sagte ftp, können Sie ein ftp-Beispiel mit wget geben?
Barlop
@barlop Die Syntax ist unabhängig vom Protokoll gleich. Der einzige Unterschied wäre der Inhalt der Dateiliste.txt, die auf das FTP-Protokoll mit dem ftp://Präfix verweist
Jarmund
und der Benutzer / Pass, es lohnt sich, die URL "ftp://username:[email protected]"
einzuschließen,
Dies löst das Problem nicht vollständig, stellte das OP fest ... während die Verzeichnisstruktur intakt blieb . Mit wget platzieren Sie alle Dateien im selben Verzeichnis.
MariusMatutiae
2

Mir ist jedoch kein Programm oder CLI-Befehl bekannt, der das Abrufen einer Dateiliste unterstützt.

Ich bin mir nicht sicher, warum dies ein Stolperstein sein sollte. Sie können ftpmit einem Skript als Quelle ausführen ,

cd Target_Directory
ftp -v -s:script.ftp ftp.myhost.net 1> /absolute/path/to/my/logfile 2>&1

Wo sollen Target_Directorydie Dateien abgelegt werden, die heruntergeladen werden sollen? script.ftpEine Skriptdatei wie die folgende:

USER MyUserId
MyPassword
cd SOURCE_DIR
binary
prompt n
mget the_first_file_I_need
mget the_second_file_I_need
bye

Dies ist in Ordnung für eine einzelne Site . Wie wäre es mit vielen Websites? Sie können eine Skriptdatei mit den folgenden Zeilen erstellen (script_main):

cd Target_Directory_1
ftp -v -s:script_1.ftp ftp.myhost_1.net 1>> /absolute/path/to/my/logfile 2>>&1
cd Target_Directory_2
ftp -v -s:script_2.ftp ftp.myhost_2.net 1>> /absolute/path/to/my/logfile 2>>&1
....

und so weiter. Sie können die scrip_N.ftpDateien vorbereiten , indem Sie die vorhandenen Informationen in ordnungsgemäß getrennte Dateien zerlegen.

MariusMatutiae
quelle
2

aria2 könnte eine möglichkeit sein.

Aus der Dokumentation :

-d, --dir =

Das Verzeichnis zum Speichern der heruntergeladenen Datei.

-i, --input-file =

Lädt die in FILE aufgelisteten URIs herunter. Sie können mehrere Quellen für eine einzelne Entität angeben, indem Sie mehrere URIs in eine einzelne Zeile setzen, die durch das TAB-Zeichen getrennt sind. Zusätzlich können Optionen nach jeder URI-Zeile angegeben werden. Optionszeilen müssen mit einem oder mehreren Leerzeichen (LEERTASTE oder TAB) beginnen und dürfen nur eine Option pro Zeile enthalten. Eingabedateien können die gzip-Komprimierung verwenden.

Dies würde eine separate Eingabedatei pro Verzeichnis erfordern.

Harrymc
quelle