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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

3回答

655閲覧

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

techno

総合スコア22

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2017/10/26 08:52

編集2017/10/26 09: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(シェルスクリプト)の記述の仕方がわかりません

###試したこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

linux

1#!/bin/sh 2ff=$(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/26 09:18

編集2017/10/30 01:28
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/10/26 09:33

バッククォートはネストさせようとするとエスケープせねばならないので$(...)の方が使いやすいのかぁといまさら気づきました。
techno

2017/10/27 01:07

A.Ichiさん おはようございます A.Ichiさんに教えて頂いたコードで試してみたのですが ncftpput /★★★.jpg: could not open file. (ncftpput /★★★.jpg:ファイルを開けませんでした。) と出てきました(この文言だけです) これはそのjpgファイルは有るけどそれをどうにかできなかったことですかね?
A.Ichi

2017/10/27 01:21

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

2017/10/27 01:31

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

2017/10/30 01:10

A.Ichiさん お返事遅れてしまって申し訳ありません 色々プログラム等を変更して実験していたら「raspberry pi」の調子が悪くなってしまって同じ設定に直すのに凄く時間が掛かってしまいました。 設定し直してA.Ichiさんから教えて頂いたプログラムを試したら動きました!! 親身になって教えて頂いて本当にありがとうございます、とても助かりました。 心からありがとうございます
guest

0

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

bash

1FILE_TO_UPLOAD=`ls -lt | head -n1`

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

FILE_TO_UPLOAD=xxx.jpg

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

bash

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

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


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

投稿2017/10/26 09:05

編集2017/10/26 09:06
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

techno

2017/10/26 09:16

KSwordOfHasteさん コメントありがとうございます 早速<code>を使い直してみました ご指摘ありがとうございます 教えて頂いたプログラムも試してみます ありがとうございます
KSwordOfHaste

2017/10/26 09:27

コードタグは質問の見易さに大きく影響するのでぜひ使ってください。 なお、自分の例はエラーチェックしてませんので、エラーがあったときに後続のコマンドがそのまま実行され危険です。その点エラーケースが配慮されているA.Ichiさんのようなコードはぐっと安全だと思います。
techno

2017/10/27 01:07

KSwordOfHasteさん おはようございます 分かりました 細々とありがとうございます A.Ichiさんのコード試してみます
A.Ichi

2017/10/30 01:33 編集

すみません間違いがありましたので変更しました (KSwordOfHaste様、間違って他の方のコメント欄に書き込み書き込み大変申し訳ございませんでした)
techno

2017/10/30 01:10

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

2017/10/30 02:08

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

2017/10/30 03:00

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

0

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

forループを使う方法

sh

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

xargsコマンドを使う方法

sh

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

投稿2017/10/27 04:10

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

techno

2017/10/30 01:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問