여러 파일을 서버에 가져오는 데 도움이 필요합니다. 스크립트를 생성했지만 모든 파일을 배치하지 않습니다.
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
.
sftp
find
인쇄된 파일 이름에 대해 별도의 명령을 만들고 이를 명령에 파이프하는 것이 좋습니다 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 logfile
or 명령 뒤의 파이프에 이와 같은 내용을 삽입할 수 있습니다. 덮어쓰는 대신 기존 로그 파일에 추가하려면 다음을 사용하세요.find
cut
tee -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