SFTP를 사용하여 여러 파일을 배치하는 방법

SFTP를 사용하여 여러 파일을 배치하는 방법

여러 파일을 서버에 가져오는 데 도움이 필요합니다. 스크립트를 생성했지만 모든 파일을 배치하지 않습니다.

cd /buffer/miscellaneous/new/
cd $(ls -t | head -n 1)
latest=$(find -mmin -60 | cut -d'/' -f2 | tail -n +2 | tr '\n' '\t')
/usr/local/bin/sshpass -p password sftp -oBatchMode=no [email protected]:/folder1 << 1
mput $latest*
bye

이 명령의 경우

find -mmin -60 | cut -d'/' -f2 | tail -n +2 | tr '\n' '\t'

출력은 2개의 csv 파일입니다.

cgi_20111210_235524.csv cgi_20203127_125504.csv

이제 문제는 mput첫 번째 파일만 배치하고 다른 파일은 배치하지 않는 것입니다.

find 명령의 출력은 다음과 같습니다.

find -mmin -60
.
./cgi_20110911_135504.csv
./cgi_20111210_235524.csv
./cgi_20203127_125504.csv

답변1

디렉터리 대신 파일만 찾는 명령을 추가하면 출력에서 ​​줄을 건너뛰는 명령을 생략할 수 있습니다 cut -d'/' -f2..find-type f

cut -d'/' -f2하위 디렉터리에 파일이 있는 경우 이 명령은 파일 이름을 생성하지 않으며, sftp이 경우 for 명령도 작동하지 않습니다. 그래서 깊이를 제한하는 것이 좋습니다 find.

sftpfind인쇄된 파일 이름에 대해 별도의 명령을 만들고 이를 명령에 파이프하는 것이 좋습니다 sftp.

{ find -maxdepth 1 -type f -mmin -60| cut -d'/' -f2 | sed 's/^/put /' ; echo bye ; } | /usr/local/bin/sshpass -p password sftp -oBatchMode=no [email protected]:/folder1

어떤 명령이 생성되었는지 보려면 sftp이 부분을 생략하면 됩니다 | /usr/local/bin/sshpass.

편집하다

파일 이름을 기록하려면 tee logfileor 명령 뒤의 파이프에 이와 같은 내용을 삽입할 수 있습니다. 덮어쓰는 대신 기존 로그 파일에 추가하려면 다음을 사용하세요.findcuttee -a logfile

예:

{ find -maxdepth 1 -type f -mmin -60 | cut -d'/' -f2 | tee logfile | sed 's/^/put /' ; echo bye ; } | /usr/local/bin/sshpass -p password sftp -oBatchMode=no [email protected]:/folder1

답변2

sftp귀하의 버전에서 이 명령을 제공 합니까 mput? sftp최근에 검색한 매뉴얼 페이지에는 이 내용이 나와 있지 않습니다 . 이전 버전과의 호환성 때문에 put여러 파일을 전송할 수 있는 명령에 대한 "별칭"으로 받아들일 수도 있을 것 같습니다. man sftp:

놓다[-afPpr]로컬 경로 [원격 경로]

로컬 경로를 업로드하고 원격 시스템에 저장합니다. 원격 경로 이름을 지정하지 않으면 해당 이름은 로컬 컴퓨터의 이름과 동일합니다. local-path에는 glob(7) 문자가 포함될 수 있으며 여러 파일과 일치할 수 있습니다.

인수가 2개인 경우 ( m)는 put두 번째 인수를 대상 파일 이름으로 사용하므로 파일 하나만 전송됩니다. 다른 매개변수는 무시됩니다.

sftp> mput 파일1 파일2

file1을 /user/TMP/file2
file1 에 업로드하는 중
100% 48 1.9KB/s 00:00

sftp여러 개의 비전역 파일에 대해 일괄 처리 모드를 고려할 수 있습니다 .put

관련 정보