質問: shでftp⇒接続切らずに成否確認して削除可? ftpで多数のファイルを転送(put)したいです。 転送した後に転送エラーがないか確認し、 転送エラーがなければローカルのファイルを削除する、 ということを1ファイルずつ行いたいです。 ftpコマンドをヒアドキュメントやコマンドファイルを使用して実行する場合、 転送エラーがあったかどうかは、ftpの出力結果を見ないと分からないので、 いったんftpコマンドを終了する必要があると思います。 そうすると、1ファイルずつftpのコネクションを張りなおさないとならないので、 wan経由での接続を考慮すると相当効率が悪いと思うのですが、 接続を切らずに実現することは可能でしょうか。 理想案: 転送先にftp接続 すべての対象ファイルに対し、 ┣ファイルをput ┗putが成功したら ┗ファイルを削除 ftp接続を切断 現実案: すべての対照ファイルに対し、 ┣転送先にftp接続 ┣ファイルをput ┣ftp接続を切断 ┗putが成功したら ┗ファイルを削除 現実案の実装だと、こんな感じかと思います。 実際に動かしてないので、間違いあるかもですが。 for file in `ls` do ftp -n ${hostname} > ftp.log << _eof user ${user} ${pass} put ${file} bye _eof if [ `grep "err" ftp.log` ]; then exit 1; else rm -f ${file} fi done
回答: no1です。 >例えば、ftpコマンドを子プロセスとして標準入力待ちとなる状態で起動しておいて、その子プロセスにメッセージを送ることは可能でしょうか。 expectコマンドを使えば可能です。ただエラー判定まですると、かなり面倒だと思います。 使い方は検索してください。 私なら、そんなことはしないで、 転送先にftp接続 すべての対象ファイルに対し、 ┗ファイルをput ftp接続を切断 すべての対象ファイルに対し、 ┗putが成功していたら ┗ファイルを削除 と、最初にまとめてputしますね。