• ベストアンサー

シェルの存在確認コマンドでファイルを認識しない

現在、solarisの吐き出すログの自動バックアップshellを運用しています。そのshellの内容は ifでディレクトリ内存在確認後、*でtarに固める、というもので、 if [ -s $abc/* ]; then cd $abc tar -cvf abc_`date "+%Y%m%d"`.tar * という内容なのですが、 if [ -s ・・・ の存在確認の時点でファイルは実際に存在するのに 存在を認識しない場合があるのです。。 ディレクトリ内のファイルの実行権を変えても認識せず、 たとえば認識しないディレクトリの中に「a」というファイルを 作って再度シェルを流してみると、今度は認識します。しかし削除するとしなくなります。また、認識しないファイルのmvで変名してやってみるとうまくいきます。 何が問題なのでしょうか?ファイルの存在確認において、認識しない場合というのがあるのでしょうか? お助けください!よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

動作しない原因はNo1の方の回答どおりです。 解決するには、 if [ `ls $abc | wc -l` -gt 0 ]; then ... とかでしょうか。

goodtreasure
質問者

お礼

遅くなりました。。申し訳ございませんでした。。そして ありがとうございました!教えていただいた方法でできました! 参考になりました!!

その他の回答 (2)

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.3

>if [ `ls $abc | wc -l` -gt 0 ]; then 空のディレクトリでも、 ./ ../ この二つはカウントされるので if [ `ls $abc | wc -l` -gt 2 ]; then の方が良いかも。

goodtreasure
質問者

お礼

そうなんですか。。?? ひょっとしてできないときもあるかもしれないんですね。。 ちょっと慎重に調べつつ運用していこうと思います。 ありがとうございました!参考にさせていただきます!

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> $abc/* このワイルドカードによって、マッチするファイルが無い場合、  [ -s $abc/* ]  は [ -s ] にとなり、シンタックス・エラーを引き起こします。逆に二つファイルがある場合、例えば [ -s foo bar ] となって、これもシンタックス・エラーを引き起こします。 結局、この書き方だと、ファイルが一つだけ存在する時しか、うまく動かないでしょう。

goodtreasure
質問者

お礼

ありがとうございました。 シンタックスエラーですか。。よく耳にはするんですが。。まだまだ勉強がたりないようです(笑 ワイルドカードという言葉も難しいようで、実は簡単なんですね。 参考になりました!ありがとうございました!

関連するQ&A