컬을 사용하여 FTP를 통해 여러 파일 업로드

컬을 사용하여 FTP를 통해 여러 파일 업로드

컬을 사용하여 현재 폴더의 모든 텍스트 파일을 FTP를 통해 서버 위치에 업로드하려고 합니다. 나는 다음 줄을 시도했습니다.

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

여기서 XXX는 서버의 IP 주소이고 YYY는 사용자 이름과 비밀번호입니다.

file1.txt를 서버로 성공적으로 전송할 수 있지만 두 번째 파일에 대해 "'file_name'을 열 수 없습니다!"라고 불평합니다.

파일 이름을 바꾸었고 file1.txt 대신 file2.txt에서 작동합니다. 내 구문이 잘못된 것 같지만 설명서에 나와 있는 내용은 무엇입니까?

또한 이상적으로는 다음과 같은 작업을 수행할 수 있습니다.

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

왜냐하면 현재 폴더에 있는 txt 파일의 이름이나 전송할 파일 개수를 항상 알지 못하기 때문입니다.

이 출력을 ls *.txt배열로 수집하고 이를 컬에 필요한 다중 파일 형식으로 저장하려면 bash 스크립트를 작성해야 할 수도 있습니다.

이전에 bash 스크립트를 작성해 본 적이 없습니다. 이것이 이를 달성하는 가장 쉬운 방법입니까?

답변1

첫 번째 명령은 공백 없이 실행되어야 합니다.

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

또한 참고하시기 바랍니다위 URL의 후행 "/"입니다.

옵션 "-T"에 관한 컬의 수동 항목은 다음과 같습니다.

-T, --파일 업로드

그러면 지정된 로컬 파일이 원격 URL로 전송됩니다. 지정된 URL에 파일 부분이 없으면 Curl은 로컬 파일 이름을 추가합니다. Curl에게 파일 이름이 없다는 것을 실제로 증명하려면 마지막 디렉토리에 /를 붙여야 합니다. 그렇지 않으면 컬은 마지막 디렉토리 이름을 사용할 원격 파일 이름으로 간주합니다. 이로 인해 업로드 작업이 실패할 가능성이 높습니다. HTTP(S) 서버에서 이 명령을 사용하면 PUT 명령이 사용됩니다.

주어진 파일 대신 stdin을 사용하려면 파일 이름 "-"(대시)를 사용하십시오. 또는 "-" 대신 파일 이름 "."을 지정하여(단일 마침표) 비차단 모드에서 stdin을 사용하여 stdin이 업로드되는 동안 서버 출력을 읽을 수 있습니다.

명령줄에서 각 URL에 -T를 지정할 수 있습니다. 각 -T + URL 쌍은 업로드할 콘텐츠와 위치를 지정합니다. 컬은 -T 매개변수의 "globbing"도 지원합니다. 즉, 다음과 같이 URL에서 지원되는 동일한 URL globbing 스타일을 사용하여 여러 파일을 단일 URL에 업로드할 수 있습니다.

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

심지어

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

'*.txt' 확장자가 작동하지 않습니다.컬은 URL과 동일한 구문만 지원하기 때문에:

다음과 같이 중괄호 안에 부분 집합을 작성하여 여러 URL 또는 URL의 일부를 지정할 수 있습니다.

http://사이트.{일,이,삼}.com

또는 []를 사용하여 다음과 같은 일련의 영숫자 계열을 얻을 수 있습니다.

ftp://ftp.numerics.com/file[1-100].txt

ftp://ftp.numericals.com/file[001-100].txt (앞에 0이 붙음)

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

[...]

[] 또는 {} 시퀀스를 사용하여 명령줄 프롬프트에서 호출할 때 셸이 방해하지 않도록 전체 URL을 큰따옴표로 묶어야 할 수도 있습니다. 이는 '&', '?' 및 '*'와 같이 특별히 처리되는 다른 문자에도 적용됩니다.

하지만다음과 같이 "일반" 쉘 와일드카드를 사용할 수 있습니다.

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

(이 마지막 예는 모든 쉘이나 모든 종류의 외부 파일 이름에서는 작동하지 않을 수 있습니다.)

답변2

Find 유틸리티를 사용하여 각 파일에 대해 차례로 컬을 호출할 수 있습니다.

find . -name '*.txt' -exec curl -T {} ftp://XXX --user YYY \;

답변3

모든 .txt 파일을 매핑한 다음 모든 외부 파일 이름을 FTP 서버에 업로드할 수 있습니다.

1 - 매핑 파일을 사용하여 업로드하려는 모든 파일을 매핑하고 이를 filename 변수에 저장합니다.

지도 파일

사용예

# 출력을 배열로 캡처합니다.

$ mapfile GEEKSFORGEEKS < <(printf "프로젝트 1\n프로젝트 2\n프로젝트 3\n") $ echo ${GEEKSFORGEEKS[@]}

여기서 Item1, Item2 및 Item 3은 GEEKSFORGEEKS 배열에 저장되었습니다.

여기에서 자세한 내용을 확인하세요: [geeksforgeeks][2]

2- 파일 이름 배열에 저장된 모든 파일을 읽고 이미 존재하는지 확인하는 루프를 생성하고( $i -lt ${#filenames[@]}), FTP에 업로드하고 모든 외부 파일 이름을 글로빙(-g), 자동(-s)(표준 입력으로만 출력 - )

콘솔에서 직접 테스트했는데 잘 작동했습니다.

filenames=(); mapfile -d '' filenames < <(find . -name '*.txt' -type f -print0)

i=0; for f in ${filenames[@]}; do [[ $i -lt ${#filenames[@]} ]] && curl -g -s -S -T "${f}" ftp://XXX/ -user YYY; i=$i+1; done

[2]: https://www.geeksforgeeks.org/mapfile-command-in-linux-with-examples/#:~:text=mapfile%20 also%20은 %20이라고 합니다(%20array를 읽고 %20을 %와 비교하세요) 20a% 20Read%20 루프.

관련 정보