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

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

ただいまの
回答率

90.50%

  • csh

    22questions

    cshは、C言語スタイルの構文を持つUNIX系OSのシェルの1つのことです。

cshを実行すると 「=: ファイルもディレクトリもありません。」が返ってくる

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 638

pkk1988

score 1

前提・実現したいこと

cshの初心者ですが、NFSサーバーに格納されているファイルのタイムスタンプを判断してバックアップを行うcshを作成し実行してみたところ、下記エラーが発生しました。

発生している問題・エラーメッセージ

csh シェル名
上記で実行すると下記エラーメッセージが帰ってきます。

=: ファイルもディレクトリもありません。

該当のソースコード

#!/bin/csh

set curPDF = "/share2/rsw/bak_pdf_test/"
set bakPDF = "/share2/rsw/bak_pdf_test1/"

cd ${curPDF}

find . -name "*.pdf" | awk '{print substr($0, 3)}' > pdf.txt

set lines = wc -l pdf.txt | awk '{print substr($0, 8, 1)}'

set i = 1
while [ ${i} <= ${lines} ]
do
set pdfFile = cat pdf.txt | sed '${i},${i}!d'
set fDate = date -r ${pdfFile} "+%S"
set curDate = date "+%S"
set diffDate = expr ${curDate}/60/60/24 - 1855

if $fDate < $diffDate then
cp -p ${pdfFile} ${bakPDF}
endif

unset pdfFile
unset fDate
unset curDate
unset diffDate

i = ${i} + 1
done

rm pdf.txt

exit

試したこと

文字コードセットをUTF-8に、改行をLFに、BOMをも外していますが、
同じエラーが帰って来ます。

補足情報(言語/FW/ツール等のバージョンなど)

実行環境はSunOS 5.8です。自分でも色々修正を試していますが、宜しければ御知恵を拝借致したく存じます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • A.Ichi

    2017/03/17 19:39 編集

    とりあえず while ( ${i} <= ${lines} ) if ( $fDate < $diffDate ) then 追記:すみませんSunOSの環境が無いので、上記は忘れてください。

    キャンセル

回答 2

checkベストアンサー

+1

とりあえず、どこまで処理が進んでるのかを確認しましょう。
スクリプトの内容を手動で動かしてみるとか

で、関係あるかわかりませんが…
・find の -name はシングルクオートにしないと展開されちゃわないスか?
・find は -print なくてもいいんでしたっけ?
・実行結果を代入する場合はバッククオートで囲みます。
・while とか if の書式が違わないスか?
・sed のとこはシングルクオートだと $xx が展開されないスよ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/18 21:14

    あと気になったのが…
    date コマンドでファイルのタイムスタンプはとれなくないか?
    タイムスタンプを条件にするなら find のオプションでよくないか?
    いちいち unset するのはデリケートすぎかなあ
    done の上の行は set と expr がいるのでは?
    lines を求めるのに awk で抽出する必要あるのか?
    set でイコールの前後は要空白(いまのままでよい)
    一時ファイルを作るなら /tmp か作業用ディレクトリの下がよい
    cp の -p オプションは実行ユーザーによっては無意味?

    キャンセル

  • 2017/03/21 15:22

    ご回答ありがとうございます!ご指摘を参考に下記のように修正いたしました。
    ---------------------------------------------------------------------------------------------------
    #!/bin/csh

    set curPDF = "/share2/rsw/bak_pdf_test/"
    set bakPDF = "/share2/rsw/bak_pdf_test1/"

    cd ${curPDF}

    find . -name '*.pdf' -mtime +3 | awk '{print substr($0, 3)}' > /tmp/pdf.txt

    set lines = `wc -l pdf.txt | awk '{print substr($0, 8, 1)}'`
    #awkで抽出するのはwcコマンドの出力結果にファイル名が含まれているため

    set i = 1
    while ${i} <= ${lines}
    do
    set pdfFile = `cat pdf.txt | awk 'NR==${i}'`
    cp ${pdfFile} ${bakPDF}

    set i = `expr ${i} + 1`
    done

    rm pdf.txt

    exit
    -----------------------------------------------------------------------------------------------------------
    上記のシェルを実行してみたところ、6行目の「set lines ...」までは問題なく実行され、pdf.txtも生成されたのですが、7行目以降が実行されず「=: ファイルもディレクトリもありません。」のエラーが発生します。

    見た感じ7行目以降に宣言された変数が正しく展開していないようにも見えるのですが。。。。宜しければご教示を賜りたく存じます。
    長文失礼いたしました。

    キャンセル

  • 2017/03/21 16:56

    takasima20さんお疲れ様です。ご指摘を参考にもう一度コードを見直したら何とか実行できました。問題点は主に下記の3点です。
    ①while文の条件式に()が抜けていた。
    ②「do~done」はいらない。
    ③「awk 'NR=='${i}''`」の変数部にもシングルクォーテーションが必要だった

    これらを解決したら問題なく動作しました。ご教示のおかげで問題が解決しました。ありがとうございました。
    最後に動作したコードを添付しておきます。ご参考までに
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    #!/bin/csh

    set curPDF = "/share/rsw/bak_pdf_test/"
    set bakPDF = "/share/rsw/bak_pdf_test1/"

    cd ${curPDF}

    find . -name '*.pdf' -mtime +3 | awk '{print substr($0, 3)}' > pdf.txt

    set lines = `wc -l pdf.txt | awk '{print substr($0, 8, 1)}'`

    set i = 1
    while (${i} <= ${lines})

    set pdfFile = `cat pdf.txt | awk 'NR=='${i}''`

    cp ${pdfFile} ${bakPDF}
    set i = `expr ${i} + 1`

    end

    rm -f pdf.txt

    exit


    キャンセル

  • 2017/03/21 17:33

    (・∀・)b

    キャンセル

+1

Solaris 環境が近くにないので、確証はありませんが、
「shスクリプト」と「cshスクリプト」の文法が混在している気はしますが・・・

date コマンドで指定している "%S" ですが、
コマンドを実行した日時の「秒」が返ってくるので
意図した値ではないと思います。

set fDate=`date -r ${pdfFile} "+%S"` 
set curDate=`date "+%S"` 

「1970-01-01 00:00:00 UTCからの秒数」であれば、"%s" (小文字)になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • csh

    22questions

    cshは、C言語スタイルの構文を持つUNIX系OSのシェルの1つのことです。