컬을 사용하여 현재 폴더의 모든 텍스트 파일을 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 루프.