bshellでftpのミラーリングを行うことになりました。
ようはwgetでいうところの-mなことがしたいのですが(ftpのmgetだと回帰的に取らせた場合にディレクトリ構造が無視されるため)
wgetを入れれる環境ではなく、bshellで同等のことをすることになりました。
ftpでログイン後にlsをかけて、その結果の各行一番初めの文字がdならディレクトリな処理、-ならファイルな処理、他なら無視をする必要があるかと思われますが、
「結果を1行ごとに解析させる」
というのがどうもやり方が思いつきません。
何かご存知の方いらっしゃいましたら返答お願いします。
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出力に含まれるようならそれを除外する処理も必要です。
また、新しいファイルと古いファイルでは日付フォーマットが変わるので、気をつけてください。
この回答への補足
仕組みがある程度わかってきましたが、
どうしても
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
だけにしても
: そのようなファイルやディレクトリはありません
とエラーが出ます。何が理由かお分かりになりませんか?
No.4
- 回答日時:
趣味でやるのなら「苦労もまた楽し」ですが。
私はUNIXに関しては20年以上の経験がありますが、断言します。
仕事なのなら、「できない」といって断るのが会社のためですし、あなたのためでもあります。なんならUNIX/Linuxに詳しいコンサルタントに相談してみてください。同じ事を言うはずです。
もし、シェルスクリプトでなんとかツールを完成したとしても、今後いろいろなトラブル(長期間安定して動くとは思えません)のたびに、呼び出されてメンテをさせられる羽目になります。会社としても業務ツールが不安定では困りますよね。
本来は、wgetをインストールできないという体制を作った人がこの責任を負わないといけないのですが、質問者様がシェルスクリプトを書いてしまうと、今後これに起因する全ての不具合は質問者様が責任を問われることが予想されます。
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を入れる事を考えた方がいいのでは?
この回答への補足
>普通、そのメッセージの「:」の前に何が「そのようなファイルやディレクトリはありません」なのか出力されると思いますが
何も出ていないので検討もついていません。フルパスで書いても同じエラーで、
done << END
hoge
fuga
END
とかとするとエラーは出なくなります。
>$modeが表示されないのは当然
前回補足した3行だけの別途稼動させたのにエラーがでるあれでも当然なのですか?
当然な理由がよくわからないのですが・・・
>素直にwgetを入れる事を考えた方がいいのでは?
会社のサーバなので、どうしても聞かなければならない状態です。wgetを入れる方向にしてくれないと厳しいor私には無理ですとずっと言ってはいるのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- ドメイン・サーバー・クラウドサービス FileZillaを使用してwpXサーバーに接続できない 2 2022/03/29 21:02
- WordPress(ワードプレス) WordPressのサイトにPDFをアップロードした際にGoogleなどの検索結果に出ないでほしい 1 2022/08/03 10:44
- 統計学 統計:アンケート結果の読み解き方法(カイ二乗検定の必要性の有無) 13 2022/12/03 23:13
- 統計学 回帰分析検証不一致 5 2022/05/04 20:48
- 事件・犯罪 刑法についてだれか助けてください。 2 2022/06/05 04:08
- 事件・犯罪 刑法についてです 2 2022/06/04 03:11
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- 心理学 卒業論文の分析について 1 2022/09/05 14:19
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 電話番号の正規表現について
-
プログラマーと学歴の関係性に...
-
vba クリップボードクリアにつ...
-
このURLで広告を出しているのは...
-
ImageMagickでgif画像の一部が...
-
小学1年生の子です。塾に行かせ...
-
プログラミングのPythonのnoteb...
-
GoogleAppsScript文字列置換の...
-
楽しくて最高のプログラミング...
-
ホワイトハッカー
-
プログラミング ソースコード
-
ものづくりに向いているプログ...
-
大学のゼミのレポートがムカつ...
-
スカラーのベクトル微分
-
初心者powershellのPS1ファイル...
-
Google ColaboでGUI作成
-
プログラミングで例えばゲーム...
-
Powershellとコマンドプロンプト
-
MacのPythonでの開発について
-
Latexに関する質問です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perlからのexcel読み込み
-
readdir におけるフルパスでの...
-
無料配布の郵便番号自動入力cgi...
-
エラーログ「\\x8ew\\x92\\xe8...
-
perl system関数 引数 フォルダ
-
Perlファイルテスト演算子が正...
-
unlink 、renameが使えない理由
-
perl上からfindを使い検索した...
-
コマンドプロンプトからperlを...
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
VBAで巨大なファイルの途中から...
おすすめ情報