• 締切済み

bshellでコマンド結果を一行ずつ解析させたい

bshellでftpのミラーリングを行うことになりました。 ようはwgetでいうところの-mなことがしたいのですが(ftpのmgetだと回帰的に取らせた場合にディレクトリ構造が無視されるため) wgetを入れれる環境ではなく、bshellで同等のことをすることになりました。 ftpでログイン後にlsをかけて、その結果の各行一番初めの文字がdならディレクトリな処理、-ならファイルな処理、他なら無視をする必要があるかと思われますが、 「結果を1行ごとに解析させる」 というのがどうもやり方が思いつきません。 何かご存知の方いらっしゃいましたら返答お願いします。

みんなの回答

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.4

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

  • Lean
  • ベストアンサー率72% (435/603)
回答No.3

>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を入れる事を考えた方がいいのでは?

sc_staff
質問者

補足

>普通、そのメッセージの「:」の前に何が「そのようなファイルやディレクトリはありません」なのか出力されると思いますが 何も出ていないので検討もついていません。フルパスで書いても同じエラーで、 done << END hoge fuga END とかとするとエラーは出なくなります。 >$modeが表示されないのは当然 前回補足した3行だけの別途稼動させたのにエラーがでるあれでも当然なのですか? 当然な理由がよくわからないのですが・・・ >素直にwgetを入れる事を考えた方がいいのでは? 会社のサーバなので、どうしても聞かなければならない状態です。wgetを入れる方向にしてくれないと厳しいor私には無理ですとずっと言ってはいるのですが・・・

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

泥沼にはいることが確実なのであまり言いたくないのですが、、、。 しいて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出力に含まれるようならそれを除外する処理も必要です。 また、新しいファイルと古いファイルでは日付フォーマットが変わるので、気をつけてください。

sc_staff
質問者

補足

仕組みがある程度わかってきましたが、 どうしても 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 だけにしても : そのようなファイルやディレクトリはありません とエラーが出ます。何が理由かお分かりになりませんか?

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

wget-m的な処理をbshellで行うのは原理的には不可能ではありませんが、「結果を1行ごとに解析させる」ことすらわからない人の手に負えるようなモノではありません。あきらめて他の手段を使ってください。 たとえば、perlで書いたwgetもありますが、ご使用の環境はperlすら入っていないのでしょうか?

sc_staff
質問者

お礼

perlも無理です

関連するQ&A