【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

皆さん、お手数ですが教えて下さい。

今Linux上で動作させるC言語のプログラミング作業を行っているのですが、その過程において以下のコマンドラインから”月”の数値を取り出したいと思っています。
(sprintfで編集したコマンドをsystemコマンドで。)

> ls -l test_11.c
-rw-rw-r-- 1 user1 group 5431 9月 25 18:02 test_11.c


以上の表示結果から、lsコマンドとawkコマンドを組み合わせて、月の数値を取り出したいのですが、
この例で言うと、月の部分には”9月”と全角の「月」という文字が付いてきます。

取り出したいのは「9」の値だけなのです。

上手くこの月の数値だけを取り出すオプションとか無いでしょうか?

もちろん、複数のコマンドをパイプで繋げるのは一向に構いません。

よろしくお願いいたします。

A 回答 (6件)

「C言語からlsコマンドを呼び出しても良い」という条件で開発するのなら、「C言語からfindコマンドを呼び出しても良い」筈ですよね。


だとしたら、C言語プログラムではreaddirもstatも行う必要はありません。

対象となりファイルリストはfindが作ってくれるので
popen()
して
char filename[MAXPATHLEN+1];

while(gets(filename)) {
do_something(filename);
}
というシンプルなプログラムで済みます。
    • good
    • 0
この回答へのお礼

回答が遅れて済みません。
動作確認出来ました。
色々教えて頂き助かりました。
ありがとうございます。

お礼日時:2007/11/25 16:40

#4 の「非常に時間を無駄にした」というのは, 「あなたの時間が無駄になったかどうか」ではありません. かなりずれた質問をしたために「他人の時間を無駄にした」ということを理解してください.


ちなみに
system("find ディレクトリリスト -mtime +183 -exec rm {} ;");
でも OK ですかねぇ>#4
    • good
    • 0
この回答へのお礼

回答が遅れて済みません。
こちらの方法でも動作可能と思います。

教えて頂き助かりました。
ありがとうございます。

お礼日時:2007/11/25 16:42

「半年以上古いファイルを消す」だったら、最初からそう書いてください。


「月の識別」と「半年以上古いか判断」では全然違います。
非常に時間を無駄にしました。

わざわざCでプログラムを作らなくても、
find ディレクトリリスト -mtime +183 -exec rm {} \;
など、既存コマンドで済みます。

この回答への補足

>「半年以上古いファイルを消す」だったら、最初からそう書いてください。
言葉が足りず、失礼しました。

但し、これはコマンドラインで実行するのではなく、仕事上C言語で作成する必要があったのです。
ですから、無駄ではないはずです。

補足日時:2007/09/26 10:46
    • good
    • 0

まじめにreaddirとstatを組み合わせても出来ます。


が、プログラムの実行効率やなんかより、とにかく急いで作ることが優先ならlsをscanfで受ければいいと思いますが。

ところで、本当に月だけで良いんですか?たとえば5月といえば、今年の5月も10年前の5月も区別しなくて良いんでしょうか?

ただ、日本語ロケールでのlsの出力は処理が面倒くさいので、こんな感じのプログラムになるかなぁ。
自分で作って自分が使うだけの使い捨てプログラムならこんなのでも良いと思いますが、お金を取って作る受注ソフトでこんな手抜きコーディングをしてはまずいです。バッファオーバーラン対策もろくにしてないし。

FILE *fp;
char month[なんとか];
fp=popen("env LANG=C ls -l ファイル名 ","r");
while(fgets(buf, SIZE, fp)!=NULL) {
if(scanf("%*s %*s %*s %*s %*s %3s ", month)!=1) ERROR処理;
 if(strcmp(month, "May")==0){・・・

この回答への補足

ご回答ありがとうございます。
早速TRYしてみます。

>たとえば5月といえば、今年の5月も10年前の5月も区別しなくて良いんでしょうか?
半年のスパンで古いファイルを削除している処理を作りたかったのです。
何が何でも”直ぐに作る”というつもりではないです。
お察しの通り仕事で使うつもりなので。
「readdirとstat」と「lsをscanf」の両方を試してみます。
ありがとうございます。

補足日時:2007/09/26 09:20
    • good
    • 0

statはコマンドではありません。


c言語の関数でファイル情報(日付等)を得ることができます。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
これと、指定ディレクトリの一覧を得るreaddir関数を組み合わせればできると思います。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
readdirの使用例は、こちらを。
http://boolabel.exblog.jp/6076113/

この回答への補足

ご回答ありがとうございます。
早速TRYしてみます。

補足日時:2007/09/26 09:19
    • good
    • 0

ファイル名が既知のファイル1つの更新月を知りたければ,C言語だったら,statシステムコールを使うのが正解.


lsを呼び出す必要なし.

この回答への補足

ご回答ありがとうございます。

実は対象ファイルの名称は特に決まっておらず、ファイル数も不特定であります。
’ある月’を超えているファイルがあったら、そのファイルを処理対象にする、というのが今回のプログラミングの趣旨なのです。

statコマンドはよく知らないのですが、この条件でも対応可能でしょうか?

補足日時:2007/09/25 19:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報