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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

2回答

379閲覧

*がついたファイルの存在確認ができません

beginner_Linux

総合スコア21

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2017/06/25 07:45

移動元ディレクトリ、対象ファイルが記載されていた外部ファイルがあます。
対象ファイルは以下の3つのです
・sample.txt
.log

変数には以下の内容が入っています。
Aには移動元ディレクトリ
Bには対象ファイル名

そして移動先ディレクトリとその中にある対象ファイルの存在確認を行ったのですが
・sample.txt
これは存在確認をすることができました。

しかし以下の2つは存在確認することができませんでした。
.log

ディレクトリもファイルも実在しています。

#!/bin/sh : if [[ -e ${A}/${B} ]]; then echo -e "対象ファイルを発見しました\n" else echo -e "対象ファイルを発見できませんでした\n" fi :

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

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

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

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

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

guest

回答2

0

しかし以下の2つは存在確認することができませんでした。

.log

ディレクトリもファイルも実在しています。

普通は、*.logというのは、「ファイル名が.logで終わるファイル」、*というのは「すべてのファイル」を意味しますが、存在確認したいのは、「ファイル名が*.logであるファイルがあるか?」ですか?「ファイル名が.logで終わるファイルが一つでもあるか?」ですか?

また、

Aには移動元ディレクトリ

と、

移動先ディレクトリとその中にある対象ファイルの存在確認を行ったのですが

-e ${A}/${B}

とは矛盾しますが、Aは移動元か移動先かどちらですか?それで、存在確認したいのは、移動元ですか?移動先ですか?

投稿2017/06/25 09:34

otn

総合スコア84533

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

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

0

以下/bin/shがbashであるという前提でコメントしてみます(※)。

[[ 式 ]]と記述した場合の意味はmanを参照すると次のように書いてありました。

[[ expression ]]

Return a status of 0 or 1 depending on the evaluation of the
conditional expression expression. ...
Word splitting and pathname expansion are not performed on the
words between the [[ and ]]
; tilde expansion, parameter and
variable expansion, arithmetic expansion, command substitution,
process substitution, and quote removal are performed. ...
-- man bash より --

[[ ]]の内側ではパス名の展開は行われないとのことです。ゆえに[[ -e * ]]の意味は「アスタリスク1文字の名前のファイルが存在するか?」という意味になると思います。

おそらく質問者さんの意図は「*というパターンのファイルが一つ以上存在するか?」ということではないでしょうか?もしそうならば[[ -e * ]]ではなく違う手段を工夫すべきだろうと思います。

例えばファイルとして存在しているかを確認するなら

bash

1files=`find ディレクトリー -depth 1 -type f -name '*' 2>/dev/null` 2if [ -z "$files" ] ; then 3 あった 4else 5 なかった 6fi

とか・・・


※: #!/bin/sh

#!/bin/shと行頭に記述するとそれは「borne shellでも動くスクリプト」という意味合いを込めてで書くことが多いと思います。しかしif [[...]]という記述は少なくともbashでは使えますがborne shellでは使えないような気がします。(違ってたらすみません)

実際の環境によって/bin/shがどのシェルになっているかは違うと思うのでもし/bin/shがbashであればif [[...]]という記述も動くと思います。
実際のところあなたの環境の/bin/shが一体どのシェルなのか自分にはわかりません。Ubuntuではdashかも知れませんし、Windowsのcygwinだとbashだったりします・・・

投稿2017/06/25 08:41

KSwordOfHaste

総合スコア18394

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

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

beginner_Linux

2017/06/25 09:24

[[]]このようにしたのは「」だと引数が多すぎますとエラーが出てしまっていたのでこのような記述をしました。 この解決策は間違いだったでしょうか?
KSwordOfHaste

2017/06/25 09:30

2つの点に問題を感じます。 (1) #!/bin/shを意識していない点 (2) [[]]の使い方を把握せずにエラーが出なければよしとした点 (1)は最初は「動けば結果オーライ」かも知れませんが(2)はいただけません。「そうかいたらどういう意味になるか」をできる限り理解して書かなければならないと思います。
KSwordOfHaste

2017/06/25 09:50

アドバイスになりそうな気がする点を確認したいのですが ls *.log と書いたらファイル名を展開しているのはlsではなくshであることをご存知でしょうか? if [ -e *.txt ] ; then... とかいたとき、a.txt, b.txtが存在している場合上の文はshによって if [ -e a.txt b.txt ] ; then ... に置き換えられた上で実行されることは大丈夫でしょうか?またこの文は if test -e a.txt b.txt ; then ... となり、まず最初にtest -e a.txt b.txtが実行されるという点は大丈夫ですか? さらにtest -e ファイル名 では「ファイル名には単一のファイルしか指定できない」ことはどうでしょう?この辺りが曖昧だったりしないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問