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

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

ただいまの
回答率

90.12%

sh(シェルスクリプト) でフォルダ(ディレクトリ)内の最新の画像を発見しそれをFTPサーバに送る(アップロード)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 859

techno

score 14

前提・実現したいこと

raspberrypi を使い sh(シェルスクリプト) でフォルダ(ディレクトリ)内の最新の画像を発見しそれをFTPサーバに送るプログラムを製作したいです

FTPサーバに転送(アップロード)は「ncftp」と言うプログラムを使用しています

発生している問題・エラーメッセージ

下記のサイト様を参考にさせて頂いて「raspberrypi」から「sh」で画像は転送(アップロード)出来ました

更に あるフォルダ(ディレクトリ)内の最新の画像を発見するコマンドも発見できました

そこでその2つを組み合わせ

フォルダ(ディレクトリ)内の最新の画像を探し出し「raspberrypi」から「sh」で転送(アップロード)するプログラムを製作したいです

それに伴いこの2つのプログラムの組み合わせ方の記述の仕方がわかりません

[Raspberry Pi] ファイルを FTP サーバーへ自動アップロードする
http://blog.withachristianwife.com/2017/09/01/uploading-files-to-ftp-server-with-raspberry-pi/

Unix Shell 最新更新日時のファイルパス
https://oshiete.goo.ne.jp/qa/6663289.html

該当のソースコード

上記のサイト様の使用例を一部書き換えてます
プログラム1とプログラム2を組み合わせるための記述の仕方

プログラム1

#!/bin/sh
ncftpput -u [FTPユーザーネーム] -p [FTPパスワード] [FTPサーバーアドレス] [アップロード先のディレクトリ] pi/date/★★★.jpg

プログラム2

ls -1t | head -n1

を組み合わせ「★★★.jpg」 (*★★★は「ls -1t | head -n1」で探し出した最新の画像)をFTPサーバに転送(アップロード)するためのsh(シェルスクリプト)の記述の仕方がわかりません

試したこと

まだまだ初心者でして最近すこしづつですが変数の使い方がわかりかけてきている者です
いろんなサイト等をみたりしたのですがどうにも行き詰まりここに助けを求めた次第です
ご教授願えないでしょうか

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

jpegファイルが有った時は、実行する様にしました。

ff=$(ls -1t *jpeg 2>/dev/null | head -n1) && [ -n "$ff" ] && ncftpput -u [FTPユーザーネーム] -p [FTPパスワード] [FTPサーバーアドレス] [アップロード先のディレクトリ] pi/date/$ff

raspberrypiでなく申し訳ありません、Linux上にてテストを行った限りでは、送信できました。ですので参考としてください。

#!/bin/sh
ff=$(ls -1t /home/hoge/test/*jpeg 2>/dev/null | head -n1) && [ -n "$ff" ] && ncftpput -u hoge -p passwd 127.0.0.1 /tmp $ff

一ラインで書かない方が普通かもしれません

#!/bin/sh
ff=`ls -1t /home/hoge/test/*jpeg 2>/dev/null | head -n1`
if [ -n "$ff" ]; then
    echo "ncftpput -u hoge -p passwd 127.0.0.1 /tmp $ff"
fi

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/27 10:21

    ls -1t *jpeg の部分をフルパス(/aaa/bbb/*jpg)にして、pi/date/$ffの部分を $ffのみにされてはどうでしょうか?

    キャンセル

  • 2017/10/27 10:31

    コメントありがとうございます
    助言された様に記述して実行したのですが先ほどと変わらずの結果でした
    開けませんと…

    キャンセル

  • 2017/10/30 10:10

    A.Ichiさん
    お返事遅れてしまって申し訳ありません
    色々プログラム等を変更して実験していたら「raspberry pi」の調子が悪くなってしまって同じ設定に直すのに凄く時間が掛かってしまいました。

    設定し直してA.Ichiさんから教えて頂いたプログラムを試したら動きました!!
    親身になって教えて頂いて本当にありがとうございます、とても助かりました。
    心からありがとうございます

    キャンセル

+1

バッククォート構文というのがありまして、

FILE_TO_UPLOAD=`ls -lt | head -n1`

こんなふうに書くとバッククォートで挟んだ内容を(サブプロセスで)実行し、その標準出力を全部読み込みその内容が「あたかも初めからバッククォートで挟まれた箇所に書かれていたかのように」解釈してくれます。上で、ls & headの結果 xxx.jpg というファイルが出力されたとすると

FILE_TO_UPLOAD=xxx.jpg

とかいてあるかのように解釈してくれるわけです。これをプログラム1の中で用いると

#!/bin/sh
FILE_TO_UPLOAD=`ls -lt | head -n1`
ncftpput -u [USER] -p [PASS] [SERVER] [DIR] pi/date/$FILE_TO_UPLOAD

と書けます。非常に単純な機能ですが、めっちゃ使い出があるので活用してみてください。


なお、質問文にコードを書く際はコードタグで囲んでください。コードが乱れていてわかりにくくなっているのがお判りだと思います。質問を編集する画面でコードの行範囲を選択し<code>ボタン押すとコードタグで囲んでくれます。ぜひこの質問を編集してみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/30 10:10

    KSwordOfHasteさん
    お返事遅れてしまって申し訳ありません
    色々プログラム等を変更して実験していたら「raspberry pi」の調子が悪くなってしまって同じ設定に直すのに凄く時間が掛かってしまいました。
    A.Ichiさんの接続の仕方(プログラム)を教えてもらい何とか動きました
    KSwordOfHasteさんの助言もあり自分の中でそういう(バッククォート構文等々)構文があると言う事が知れて凄く勉強になりました。
    ありがとうございました。

    キャンセル

  • 2017/10/30 11:08

    >A.Ichiさん
    「間違って他の方のコメント欄に・・・」は2つ上のコメントのことでしょうか。このコメント欄の2番目で「A.Ichiさんの回答の方がよい」とコメントしていた関係上、自分は全然違和感がありませんでした...

    キャンセル

  • 2017/10/30 12:00

    いえ、私自身の間違いのコメントを間違って記入いたしました。大変失礼いたしました。

    キャンセル

0

別法を二つ提案します。いずれの構文も、対象ファイルがゼロだったり2個以上だったりする場合にも適用できるはずです。
ここではncftpではなく、echoを呼び出すことにします。期待したファイル名が過不足なく表示されていることを確認したうえでncftpputに書き換えるといいと思います。

forループを使う方法

for a in `ls -1t *jpeg 2>/dev/null | head -n1` ; do echo $a ; done 

xargsコマンドを使う方法

ls -1t *jpeg 2>/dev/null | head -n1 | xargs -i echo $a 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/30 10:10

    KojiDoiさん
    コメントありがとうございます
    お返事遅れてしまって申し訳ありません
    二つも提案して頂きありがとうございます
    プログラムなのですがA.Ichiさんのプログラムを使い動かす事が出来ました
    KojiDoiさんに教えて頂いたプログラムも試してみます
    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Linuxに関する質問
  • sh(シェルスクリプト) でフォルダ(ディレクトリ)内の最新の画像を発見しそれをFTPサーバに送る(アップロード)