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.


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 ...


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 .


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:password@blah.xyz"
— 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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.