- 締切済み
リモートホストに画像だけコピーしたい
お世話になります、シェルスクリプト初心者です。 当方では、sshの鍵接続でリモートホストに接続し scp若しくはsshで画像だけのコピーをしたいと考えています。 接続するユーザ: user(ssh鍵作成済で、鍵だけでsshに入れるようにした) ローカルホスト:192.168.11.101 画像パス:/home/user/img/(サブディレクトリがたくさんある)/*.jpg|.gif|.png リモートホスト:192.168.11.200 画像パス:/home/user/img/(サブディレクトリがたくさんある)/*.jpg|.gif|.png シェル: ------ #!/bin/sh for FILE in `find /home/user/img/ -regex ".*\.\(jpg\|png\|gif\|JPG\|GIF\|PNG\)"`; # do /usr/bin/scp -P 22 -i "/home/user/.ssh/id_rsa" -r $FILE user@192.168.11.200:$FILE; # do /usr/bin/rsync -av -e "ssh -i /home/user/.ssh/id_rsa" $FILE user@192.168.11.200:$FILE; done ------ ここで問題が起きました。 for文で画像パスであるファイルパスを探し そのファイルパスをscpまたはrsyncでファイルをコピーするんですが、 リモートホストにローカルホストとおなじディレクトリがない場合、 以下のエラーメッセージが返ってきてしまいます。 ------ building file list ... done rsync: push_dir#3 "/home/user/img/(サブディレクトリ)" failed: No such file or directory (2) rsync error: errors selecting input/output files, dirs (code 3) at main.c(545) [receiver=2.6.8] rsync: connection unexpectedly closed (8 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(463) [sender=2.6.8] ------ scpやrsyncで「ディレクトリがない場合、作成」をしたいのですが、 それはscpやrsyncのオプションで叶うものなのでしょうか。 または、他の方法で叶うものなのでしょうか。 ご教授をお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
No1です。 >(1)for FILE in~のくだりで、画像パスを抽出する forとか使ってないのですけど。。。 (1) 対象のファイル一覧をfindで出力 (2) それらのファイルをcpioで固める(圧縮はしません。くっつけるだけ) (3) 固めた物をsshで相手に転送 (4) 転送先でcpioで元に戻す
- notnot
- ベストアンサー率47% (4900/10358)
No1です。 >ローカルホストとリモートサーバとのディレクトリ構造がとまったく同じ状態で同期したいのです。 その前提ですが?? tar とか使ったこと無いのですか?もとの構造そのままで復元されますよ。
お礼
読解力がなく、申し訳ございませんでした。 現在、他の作業があるので、まだnotnot様のシェルを試していないのですが 参考ソースのとおりの考え方でいきますと、以下の解釈でよろしいでしょうか。 (1)for FILE in~のくだりで、画像パスを抽出する (2)cpioで一旦画像パス単体を圧縮 (3)上記cpioのアーカイブから取り出した物(+ディレクトリ生成)をリモートに転送する。
- EF_510
- ベストアンサー率50% (306/604)
条件付きですが… 転送元で「転送したくないファイル」をパターン指定(逆の検索をする)できるのであれば --excludeオプションが使用できます 参考実行例 [admin@localhost ~]$ rm -rf sync2/ [admin@localhost ~]$ tree sync1/ sync1/ |-- sub1 | |-- sync1.abc | |-- sync1.cde | `-- sync1.fgi |-- sync1.abc |-- sync1.cde `-- sync1.fgi 1 directory, 6 files [admin@localhost ~]$ rsync -adv --delete --exclude="*.cde" --exclude="*.fgi" sync1/ sync2 building file list ... done created directory sync2 ./ sync1.abc sub1/ sub1/sync1.abc sent 230 bytes received 76 bytes 612.00 bytes/sec total size is 0 speedup is 0.00
お礼
ありがとうございます。 除外オプションで、画像以外でアップロードされている拡張子をすべて除外して、 画像のみ一括転送できるようになりました。 ・たくさんの画像パスをアップロード:--excludeオプションで不要な拡張子を除外し、ディレクトリごと転送する ・最初から画像のみひとつずつ転送する:No1:notnot様の方法 以上の使い分けでやってみます。
- notnot
- ベストアンサー率47% (4900/10358)
オプションは無さそうですね。tar とか cpio とかを使う。 find /home/user/img/ -regex ".*\.\(jpg\|png\|gif\|JPG\|GIF\|PNG\)" | cpio -o | ssh -i "/home/user/.ssh/id_rsa" user@192.168.11.200 cpio -idm 出力先を違うディレクトリにしたい場合は、 cd /home/user/img find . -regex ".*\.\(jpg\|png\|gif\|JPG\|GIF\|PNG\)" | cpio -o | ssh -i "/home/user/.ssh/id_rsa" user@192.168.11.200 sh -c '"cd /tmp; cpio -idm"'
補足
ありがとうございます。 しかし、すみません。私の説明不足でした。 やりたいことはディレクトリの画像に限った同期で 出力先はローカルホストと全く同じディレクトリでやりたいです。 用途としては、 ・ローカルホスト(Linux CentOS 192.168.11.101) ・リモートサーバ(Linux CentOS 192.168.11.200) ローカルホスト上の画像ファイル「のみ」を、ディレクトリの構造を変更せず ローカルホストとリモートサーバとのディレクトリ構造がとまったく同じ状態で同期したいのです。 そのため、圧縮は使いません。
お礼
詳しいご説明ありがとうございました。 おかげさまで使えるコマンドを調べるいい機会になりました。 今後ともトンチンカンな質問をするかもしれませんが、宜しくお願いいたします。 最後に、トンチンカンなこと言って申し訳ございませんでした。