• ベストアンサー

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

現在、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

  • シェルを自動起動したい

    現在、solaris系のシェルを組んでいます。サーバのあるディレクトリのデータを、ある時間がきたら自動的に指定のディレクトリにバックアップするようにしたいのですが、たとえば簡単に、圧縮コマンドの tar -cvf ***.tar /back/**** のほかに、時間指定のコマンドを、どう記述すればいいのでしょうか?それとも他のシェルが必要になるのでしょうか??

  • unix の mv コマンド

    unix の mv コマンドの mv -i directory1 directory2 の場合で、directory2が既存でない場合、directory1をdirectory2 に移動する(変名する)と、 参考書に書いてありますが、既存でないとは、lsでは、ディレクトリー名が出てくるけど、emptyなディレクトリーということでしょうか(ファイルが入ってない)? mv -i filename1 filename2 の場合、filename1 を filename2 に移動(変名する)と参考書にありますが、ファイルの名前だけ変えることじゃなくて中身も変えるということでしょうか? mv コマンドでは、単にファイルの名前だけ変えることはできないということでしょうか? unix超初心者で申し訳ありませんが、よろしくお教えください。

  • UNIXのtarコマンドについて

    tarコマンドで以下の様に指定して、カレントディレクトリ配下のファイルのみをアーカイブしたいのですが、カレントディレクトリ自身の情報もアーカイブされてしまいます。ファイルのみをアーカイブすることは出来ないでしょうか?よろしくお願い致します。 tar cvf (tarファイル名) -C (ディレクトリ名) .

  • tarコマンドで

    ログインしたユーザーのホームディレクトリがカレントディレクトリで、 tar -cvf /dev/hda . というコマンドを実行した場合は、ユーザのホームディレクトリのすべてのファイルを新しくアーカイブしてhdaに書き出すという意味で良いのでしょうか?

  • 8GB以上のファイルが読み込めません

    RedHatLinux ES4.6 でLTOに書き込んだファイルが Solaris10 で読み込めなくて困っています。 ファイルサイズが8GB未満の場合は問題ないのですが、 8GBを超えている場合、ディレクトリの検査合計エラーが 出力されてしまいます。 Solaris側でgtarを使えば読み込めることはわかっているのですが、 Solaris側担当は、容易には対応してくれません。 なんとかRedHat側のLTO書き込み時のオプション変更で回避したいのですが、何かよい方法はないでしょうか? 書き込み(RedHat) fileaが33GB tar cvf /dev/st0 filea fileb 読み込み側(Solaris) tar xvf /dev/rmt/1

  • 特定の「文字列を含まない」正規表現

    tarコマンドでファイルのアーカイブを作成しようとしています。 特定のディレクトリは対象外としたいのですが、正規表現の記述がわかりません。 ご教授いただきたくお願いいたします。 具体的には、、 --- ディレクトリ「abc」配下にあるファイルをアーカイブする場合、 tar cvf /tmp/xxxx.tar abc などと記述しますが、abc配下にある「statistics」といディレクトリはアーカイブ対象外とし、statistics以外をアーカイブしたいのですが、方法がわかりません。 シェルは bashです。 どなたかご存じの方、よろしくお願いいたします。

  • jarコマンドによるアーカイブファイル作成

    Mac OSX 10.3.9での話ですが、Windowsでも同様の現象に陥ります。 以下のようにjarコマンドで、カレントディレクトリ下のファイルをアーカイブ化しようとしたのですが、固まっているのか、何も出てきません。何故でしょうか? % jar cvf t.jar * 個々のファイルを指定するとjarファイルが正しく生成されるのですが、 マニフェストファイル作成に時間がかかりすぎているのかなと思って、 % jar cvMf t.jar *  とやっても同様でした。tarコマンドは正しく動くことは確認しています。

  • UNIX(Solaris)でのtarファイルの解凍エラー

    AというUNIX(Solaris)でtar cvf で固めたフォルダ階層を別のBというUNIX(Solaris)でtar xvfで解凍すると、 tes, 7 テープブロック tar: ディレクトリの検査合計エラーです というエラーメッセージがコンソールに出力されます。 これは、Solarisじゃない別のOSから持ってきた場合に出力されるという話は聞いたことがあるのですが、同じSolarisで圧縮したものを解凍してもでるのでしょうか? どのような条件下で出力されるエラーかご存知方がいらっしゃいましたらご教授のほどお願いいたします。

  • findコマンドで2週間以内のファイルをあるフォルダに移動するのですが。。

    現在solarisのシステムを運用しています。 ログを毎日定時にバックアップしていますが、 findコマンドで2週間以内のファイル探し、オプションのexec mvで、あるフォルダに移動するという方法を取っています。問題なく移動されるものの、変なメッセージが表示されます。 cannot open /abc/def ファイルが見つかりません cannot open /abc/def/aaa.tar ファイルが見つかりません ・・・ というのがずらーっと出てきます。 これはどういう意味なのでしょうか? このままクーロンとかで運用しても問題ないでしょうか?

  • ディレクトリの存在有無の確認方法

    VB6を使っています。 ファイルの存在有無はFileSystemObjectを使って以下のような方法で確認しいますが、ディレクトリの存在有無はどのようにすれば、確かめられるでしょうか? Dim objFileSys As Object Set objFileSys = CreateObject("Scripting.FileSystemObject") If objFileSys.FileExists("C:ABC.XYZ") Then よろしくお願いします。