複数のファイルをサーバーにインポートするのに役立ちます。スクリプトを作成しましたが、すべてのファイルを配置するわけではありません。
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
2番目の引数を宛先ファイル名として使用するため、1つのファイルのみが送信されます。他のパラメータは無視されます。
sftp> mputファイル1ファイル2
file1 を /user/TMP/file2
file1 にアップロード中
100% 48 1.9KB/s 00:00
sftp
複数の非大域ファイルのバッチモードを検討できます。put