質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Q&A

解決済

2回答

2815閲覧

FTP接続時に変数定義できるかどうか

kou-kiri

総合スコア5

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

0グッド

0クリップ

投稿2021/08/06 05:36

編集2021/08/06 06:13

FTP接続を行うシェルを作成しているのですが、
FTP接続中に変数を定義することは可能でしょうか?
調べた所感ではそもそもFTPに変数利用しないようなので、できないのではと思い質問させていただきました。

ftp -inv << END open サーバアドレス user ユーザー名 パスワード binary cd 転送元ディレクトリ lcd 転送先ディレクトリ files=$(ls) get ${files} delete ${files} quit END

やりたいこととしては、

  • FTPサーバの転送させたいフォルダからファイルのリストを作成、(変数定義)
  • リストに載っているもののみを転送させ、その後削除させる

リスト作成は転送と削除で差分が出ないようにするためです。

上記のシェルを流すと、以下が表示されコマンドは実行されません。

Invalid command

FTP初心者のため、基礎的な質問をしているかもしれませんが、

何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ヒアドキュメントの部分はftpコマンド実行前に評価されるので無理でしょう。

ステップを分ければいいのでは?

shell

1 2files=$(ftp <<EOD 3... 4dir 5... 6EOD 7) 8 9for file in $(files) 10do 11 ftp <<EOD 12 delete ${file} 13EOD 14done 15 16...


追記。

別案。files変数からgetとdeleteのコマンドを生成して、まとめてftpに食わせる。

何度も申し訳ありません。
こちらの案ですが、どのようにfile変数からコマンドを生成するのでしょうか?
試しに
getCommnd=("get test.jpg" "get test2.jpg")
として、ftpのヒアドキュメントのget使用箇所に
${getCommnd[@]}
として置換えてみましたが、コマンドと認識されませんでした。

ftp環境なんて身近に建っていないので、ローカルなファイルを例に。

shell

1$ ls hoge 2a b c d e f

shell

1$ cat xx.sh 2#!/bin/sh 3 4files=$(cd hoge; ls) 5 6( 7echo user id password 8 9for f in ${files} 10do 11 cat <<EOD 12get hoge/${f} local/${f} 13del hoge/${f} 14EOD 15done 16 17echo bye 18) | cat

shell

1$ sh xx.sh 2user id password 3get hoge/a local/a 4del hoge/a 5get hoge/b local/b 6del hoge/b 7get hoge/c local/c 8del hoge/c 9get hoge/d local/d 10del hoge/d 11get hoge/e local/e 12del hoge/e 13get hoge/f local/f 14del hoge/f 15bye

xx.shの最後のcatをftp -nとかに変える。
なお、ftpのサブコマンド自体、さっぱり思い出せないので内容はとても適当です。

投稿2021/08/06 06:21

編集2021/08/11 12:30
shiketa

総合スコア4114

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kou-kiri

2021/08/06 07:43

ヒアドキュメントについて理解が足りてませんでした。 ご指摘ありがとうございます。 教えていただいた方法ですと、ファイルごとにFTP接続していますが これってファイルの数によっては膨大な数のFTP接続をすることになりますよね?
shiketa

2021/08/06 13:07

> これってファイルの数によっては膨大な数のFTP接続をすることになりますよね? 膨大?べつに同時に接続するわけではないので、時間がかかるだけでナニも問題ないのでは? 別案。files変数からgetとdeleteのコマンドを生成して、まとめてftpに食わせる。 まぁ、自分なら、getが成功したかどうかもわからないのにそのファイルをdeleteするなんて、とてもとても恐ろしくてカンベンしてほしいですが。
kou-kiri

2021/08/11 07:15 編集

>別案。files変数からgetとdeleteのコマンドを生成して、まとめてftpに食わせる。 何度も申し訳ありません。 こちらの案ですが、どのようにfile変数からコマンドを生成するのでしょうか? 試しに getCommnd=("get test.jpg" "get test2.jpg") として、ftpのヒアドキュメントのget使用箇所に ${getCommnd[@]} として置換えてみましたが、コマンドと認識されませんでした。
kou-kiri

2021/08/12 00:36

追記ありがとうございました! おかげさまで出来ました!!
guest

0

変数はさておき、目的を果たすためには、

sh

1ftp -inv << END 2open サーバアドレス 3user ユーザー名 パスワード 4binary 5prompt 6 7cd 転送元ディレクトリ 8lcd 転送先ディレクトリ 9mget * 10mdelete * 11quit 12END

です。promptサブコマンドを書かないと1ファイル毎に確認応答が必要。

getが一部失敗してもmdeleteで全部消えますが、それは質問文のコードイメージでも同じなので、そのままです。
ftpの場合、転送が成功したかどうかを確認するのは面倒です。両方でサイズをチェックして一致を見るくらい。

投稿2021/08/06 14:19

otn

総合スコア86293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問