アプリ版:「スタンプのみでお礼する」機能のリリースについて

bshellでftpのミラーリングを行うことになりました。
ようはwgetでいうところの-mなことがしたいのですが(ftpのmgetだと回帰的に取らせた場合にディレクトリ構造が無視されるため)
wgetを入れれる環境ではなく、bshellで同等のことをすることになりました。

ftpでログイン後にlsをかけて、その結果の各行一番初めの文字がdならディレクトリな処理、-ならファイルな処理、他なら無視をする必要があるかと思われますが、
「結果を1行ごとに解析させる」
というのがどうもやり方が思いつきません。

何かご存知の方いらっしゃいましたら返答お願いします。

A 回答 (4件)

泥沼にはいることが確実なのであまり言いたくないのですが、、、。


しいてshでやるならば、
・有るディレクトリのファイルを取得する、ということごとにftpを起動する。ftpに接続したままで次々コマンドを与える事はあきらめる。
・ftpのコマンドを標準入力から与える。
・lsの出力は標準出力に出すのではなく、ローカルファイルを指定してそれに入れされるのがあとで処理が楽(詳しくはftpコマンドのマニュアル)
で、こんな感じで処理

while read mode link owner group size time filanem ;do
case "$mode" in
total*) ;; #無視
d*)ディレクトリの場合の処理 ;;
-*)ファアイルの場合の処理 ;;
l*)シンボリックリンクの場合の処理 ;;
esac
done < ftpのls出力を入れたファイル

あくまでも概念ですが、、、。

ftpのls -lの出力形式は、相手ftpサーバーの種類のよって一定ではないので、面倒です。特定のftpサーバ決めうちなら楽ですが。もし.や..がls出力に含まれるようならそれを除外する処理も必要です。
また、新しいファイルと古いファイルでは日付フォーマットが変わるので、気をつけてください。

この回答への補足

仕組みがある程度わかってきましたが、
どうしても

ftp -i -v -n $FTP_ADDRESS << END >>$LOG
user $FTP_ID $FTP_PW
ls / ftpls.log
#y
quit
while read mode link owner group size time filanem; do
echo $mode
done < ftpls.log
で$modeが表示されません。

一度、別のshファイルを作って
while read aa; do
echo $aa
done < ftpls.log
だけにしても
: そのようなファイルやディレクトリはありません
とエラーが出ます。何が理由かお分かりになりませんか?

補足日時:2006/09/19 13:11
    • good
    • 0

趣味でやるのなら「苦労もまた楽し」ですが。


私はUNIXに関しては20年以上の経験がありますが、断言します。
仕事なのなら、「できない」といって断るのが会社のためですし、あなたのためでもあります。なんならUNIX/Linuxに詳しいコンサルタントに相談してみてください。同じ事を言うはずです。
 もし、シェルスクリプトでなんとかツールを完成したとしても、今後いろいろなトラブル(長期間安定して動くとは思えません)のたびに、呼び出されてメンテをさせられる羽目になります。会社としても業務ツールが不安定では困りますよね。
 本来は、wgetをインストールできないという体制を作った人がこの責任を負わないといけないのですが、質問者様がシェルスクリプトを書いてしまうと、今後これに起因する全ての不具合は質問者様が責任を問われることが予想されます。
    • good
    • 0

>ftp -i -v -n $FTP_ADDRESS << END >>$LOG


>user $FTP_ID $FTP_PW
>ls / ftpls.log
>#y
>quit
>while read mode link owner group size time filanem; do
>echo $mode
>done < ftpls.log
>で$modeが表示されません。

上記通りのスクリプトなら$modeが表示されないのは当然だと思いますが。
ftpコマンドに「<< END」で、どこまで入力されているのか分かりますか?


>: そのようなファイルやディレクトリはありません

普通、そのメッセージの「:」の前に何が「そのようなファイルやディレクトリはありません」なのか出力されると思いますが、それが無いのでは?


wgetを入れられない理由は分かりませんが、このままだといつまで経ってもご希望のものは出来ないと思いますよ。
素直にwgetを入れる事を考えた方がいいのでは?

この回答への補足

>普通、そのメッセージの「:」の前に何が「そのようなファイルやディレクトリはありません」なのか出力されると思いますが
何も出ていないので検討もついていません。フルパスで書いても同じエラーで、
done << END
hoge
fuga
END
とかとするとエラーは出なくなります。

>$modeが表示されないのは当然
前回補足した3行だけの別途稼動させたのにエラーがでるあれでも当然なのですか?
当然な理由がよくわからないのですが・・・

>素直にwgetを入れる事を考えた方がいいのでは?
会社のサーバなので、どうしても聞かなければならない状態です。wgetを入れる方向にしてくれないと厳しいor私には無理ですとずっと言ってはいるのですが・・・

補足日時:2006/09/20 09:37
    • good
    • 0

wget-m的な処理をbshellで行うのは原理的には不可能ではありませんが、「結果を1行ごとに解析させる」ことすらわからない人の手に負えるようなモノではありません。

あきらめて他の手段を使ってください。

たとえば、perlで書いたwgetもありますが、ご使用の環境はperlすら入っていないのでしょうか?
    • good
    • 0
この回答へのお礼

perlも無理です

お礼日時:2006/09/14 13:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!