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

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

新規登録して質問してみよう
ただいま回答率
85.50%
csh

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

Q&A

解決済

2回答

4009閲覧

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

pkk1988

総合スコア7

csh

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

0グッド

0クリップ

投稿2017/03/17 09:31

###前提・実現したいこと
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です。自分でも色々修正を試していますが、宜しければ御知恵を拝借致したく存じます。

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

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

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

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

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

A.Ichi

2017/03/17 11:21 編集

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

回答2

0

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

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

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

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

投稿2017/03/17 12:53

gorogoroIT

総合スコア447

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

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

0

ベストアンサー

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

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

投稿2017/03/17 11:29

takasima20

総合スコア7458

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

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

takasima20

2017/03/18 12:14

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

2017/03/21 06: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行目以降に宣言された変数が正しく展開していないようにも見えるのですが。。。。宜しければご教示を賜りたく存じます。 長文失礼いたしました。
pkk1988

2017/03/21 07: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
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問