Przesyłanie wielu plików przez FTP za pomocą curl

14

Próbuję przesłać wszystkie pliki tekstowe w bieżącym folderze przez FTP do lokalizacji serwera za pomocą curl. Wypróbowałem następującą linię:

 curl -T "{file1.txt, file2.txt}" ftp://XXX --user YYY

gdzie XXX to adres IP serwera, a YYY to nazwa użytkownika i hasło.

Jestem w stanie pomyślnie przesłać plik1.txt na serwer, ale narzeka na drugi plik, mówiąc: „Nie można otworzyć” nazwa_pliku! ”

Zamieniłem nazwy plików i zadziałało to dla file2.txt, a nie file1.txt. Wygląda na to, że mam niepoprawną składnię, ale tak mówi instrukcja?

Idealnie byłbym w stanie zrobić coś takiego:

 curl -T *.txt ftp://XXX --user YYY

ponieważ nie zawsze będę znać nazwy plików TXT w bieżącym folderze lub liczbę plików do przesłania.

Moim zdaniem może być konieczne napisanie skryptu bash, który zbiera dane wyjściowe ls *.txtdo tablicy i umieszcza je w formacie wielu plików wymaganym przez curl.

Nie robiłem wcześniej skryptów bashowych - czy to najprostszy sposób na osiągnięcie tego?

JJT
źródło

Odpowiedzi:

20

Twoje pierwsze polecenie powinno działać bez białych znaków:

curl -T "{file1.txt,file2.txt}" ftp://XXX/ -user YYY

Zwróć także uwagę na końcowe „/” w powyższych adresach URL.

To jest ręczny wpis curl dotyczący opcji „-T”:

-T, - pobierz plik

To przenosi określony plik lokalny na zdalny adres URL. Jeśli w podanym adresie URL nie ma części pliku, Curl dołączy lokalną nazwę pliku. UWAGA: musisz użyć znaku końca / w ostatnim katalogu, aby naprawdę udowodnić Curlowi, że nie ma nazwy pliku, lub curl pomyśli, że nazwa twojego ostatniego katalogu to zdalna nazwa pliku do użycia. Najprawdopodobniej spowoduje to niepowodzenie operacji przesyłania. Jeśli jest to używane na serwerze HTTP (S), zostanie użyta komenda PUT.

Użyj nazwy pliku „-” (pojedynczy myślnik), aby użyć standardowego wejścia zamiast danego pliku. Alternatywnie nazwa pliku „.” (pojedynczy okres) można określić zamiast „-”, aby używać stdin w trybie nieblokującym, aby umożliwić odczyt danych wyjściowych serwera podczas przesyłania stdin.

Możesz podać jeden -T dla każdego adresu URL w wierszu polecenia. Każda para -T + URL określa, co przesłać i gdzie. curl obsługuje również „globowanie” argumentu -T, co oznacza, że ​​możesz przesłać wiele plików do jednego adresu URL, używając tego samego stylu globowania adresu URL obsługiwanego w adresie URL, na przykład:

curl -T "{file1,file2}" http://www.uploadtothissite.com

lub nawet

curl -T "img[1-1000].png" ftp://ftp.picturemania.com/upload/

Rozszerzenie „* .txt” nie działa, ponieważ curl obsługuje tylko tę samą składnię, co w przypadku adresów URL:

Możesz określić wiele adresów URL lub części adresów URL, pisząc zestawy części w nawiasach klamrowych, jak w:

http: // site . {one, two, three} .com

lub możesz uzyskać sekwencje serii alfanumerycznych, używając [] jak w:

ftp://ftp.numericals.com/file[1-100-100.txt

ftp://ftp.numericals.com/file[001-100-100].txt (z wiodącymi zerami)

ftp://ftp.letters.com/file[az].txt

[...]

Podczas korzystania z sekwencji [] lub {} po wywołaniu z wiersza poleceń, prawdopodobnie musisz umieścić pełny adres URL w cudzysłowie, aby uniknąć zakłóceń powłoki. Dotyczy to również innych znaków traktowanych specjalnie, takich jak na przykład „&”, „?” i '*'.

Ale możesz użyć „normalnego” globowania powłoki w następujący sposób:

curl -T "{$(echo *.txt | tr ' ' ',')}" ftp://XXX/ -user YYY

(Ostatni przykład może nie działać we wszystkich powłokach lub z jakimikolwiek egzotycznymi nazwami plików).

rudimeier
źródło
$(perl -e 'print join(",",@ARGV)' *.txt)poprawnie obsługuje nazwy plików ze spacjami.
ivan_pozdeev