シェルスクリプトでのディレクトリの指定について質問です。


コメント欄に示すスクリプトを動作させようとしているのですが、
「No such file or directory」
となり、うまく動作しません。

正しいディレクトリの指定方法を教えて下さい。

尚、サーバーはXREA、フォルダには実行権限を与えてあります。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/03/13 21:22:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:CoolDriver No.1

回答回数20ベストアンサー獲得回数4

ポイント100pt

2行目(3行目,4行目も)の = のあとに空白があるようなので削除してください。

bashの変数代入は、= の前後に空白があってはいけません。

id:ReoReo7

ありがとうございます。

早速試してみましたが、エラーが抜けません。

/virtual/userid/public_html/test.com/files/cgi/check.sh: line 7: cd: /virtual/userid/public_html/test.com/files/csv/test1/

: No such file or directory

find: paths must precede expression

Usage: find [-H] [-L] [-P] [path...] [expression]

かなり膨大な時間を使ってきましたが、なかなか解決できずに非常に困っています。

どなたかお力添え頂けますようお願い致します。。

2009/03/13 19:51:07
  • id:ReoReo7
    実行しようとしているファイル

    #!/bin/bash
    WORKDIR= /virtual/userid/public_html/test.com/files/csv/test1/
    BACKDIR= /virtual/userid/public_html/test.com/files/csv/test1/back
    LOGFILE= /virtual/userid/public_html/test.com/files/csv/test1/log.txt
    INPUT=*.csv
    OUTPUT=master.csv
    cd $WORKDIR
    find $INPUT \! -name $OUTPUT -exec cat {} \; >> $OUTPUT
    find $INPUT \! -name $OUTPUT -exec echo `date` {} "を処理しました" \; >> $LOGFILE
    find $INPUT \! -name $OUTPUT -exec mv {} $BACKDIR \;
    ## find $INPUT \! -name $OUTPUT -exec rm {} \;

    エラーコード
    /virtual/userid/public_html/test.com/files/cgi/check.sh: line 2: /virtual/userid/public_html/test.com/files/csv/test1/: No such file or directory
  • id:CoolDriver
    エラーメッセージが7行目になってるので、進展してますよ、たぶん。

    さて、返答中のエラーメッセージ
    ------------
    /virtual/userid/public_html/test.com/files/cgi/check.sh: line 7: cd: /virtual/userid/public_html/test.com/files/csv/tts1/
    : No such file or directory
    ------------

    について、
    1.
    tts1 というディレクトリ名は正しいか(上記コメント欄と違うので)

    2.
    tts1/ と : No such ... はおなじ行に出力されていないか

    1. はそのままです。本当にそのディレクトリがありますでしょうか(たぶん、長い時間検討されているようなので問題ないでしょう)

    2. ですが、もし違う行に出力されているのであれば、check.sh の文字コードが CR+LF で、WORKGROUP に CR が代入されている可能性が考えられます(ただ、推測の域を出ないのでコメント欄で書いてます)。
    解決法としては、該当のファイルの改行コードを LF のみに変更すれば良いと思います。nkf とか lv とか iconv とかのツールでできます。

    的外れだったらゴメンナサイ^^
  • id:ReoReo7
    ありがとうございます。

    >1.
    >tts1 というディレクトリ名は正しいか(上記コメント欄と違うので)
    正しいです。すみません、test1と書くところを間違えました。

    >2.
    >tts1/ と : No such ... はおなじ行に出力されていないか

    2.が怪しいです。違う業に出力されています。

    該当のファイルの文字コードと改行コードは、EUCとLFでよろしいでしょうか?
  • id:CoolDriver
    > 該当のファイルの文字コードと改行コードは、EUCとLFでよろしいでしょうか?
    日本語を扱わないのであれば、文字コードは不問ですね。違う行にメッセージが出力されているとのことですので、改行コードはLFにしてみてください。
  • id:ReoReo7
    ありがとうございます。
    改行コードをLF、実行パスをSHのあるフォルダと同じにして実行したところ、動いたみたいです!

    いろいろと設定して、今度は実行パスを変えたいと思います。
  • id:ReoReo7
    CoolDriverさん

    >日本語を扱わないのであれば、文字コードは不問ですね。違う行にメッセージが出力されているとのことですので、改行コードはLFにしてみてください。

    ありがとうございます。コードに日本語を入れようとする場合は、どのようにしたら良いのでしょうか。
  • id:ReoReo7
    みなさまありがとうございました。

    1:No Such...のエラーが別の行に出力されている

    という症状より、該当のファイルの改行コードをLFにしたところ、解決いたしました。

    ありがとうございました。
  • id:CoolDriver
    文字コードの扱いですが、大体、以下の2つが絡んできます。
    1. 入力データ(ファイルなど)の文字コード
    2. 環境変数 LANG
    一番確実なのは、すべてのデータとプログラム、および、LANG の設定を統一することだと思います。ただ必須ではありません(daemon として動かす場合は LANG 関係あるのかな?分かりません)。

    個人的には、シェルの場合は LANG に合わせて(LANGを変えてもいいですけど)、データの入出力をする場合に必要であれば、nkf や iconv を使います。また、端末上で結果やログを確認する場合は、lv や less を使えばさほど文字コードを意識しなくてすむので問題ないです。
    が、特定のアプリケーション(MSOffice や OOo)などで開くことを目的とする場合は、出力ファイルの文字コードを考える必要があるかもしれません(たとえば、EUC の csv ファイルは Excel で日本語が読めない)。

    まぁ、Unix/Linux 系であれば EUC でほとんど問題ないと思います。個人的には最近 Ubuntu ばっかりなので、UTF-8 で統一してますが。
  • id:ReoReo7
    >CoolDriverさん

    ありがとうございます。
    SJISにしたところ、日本語が読めるようになりました。

    いろいろと文字コードについてもあるのですね。
    参考にします。ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません