• ベストアンサー

ls -l コマンドの結果から月の値だけを取りだしたい

皆さん、お手数ですが教えて下さい。 今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-saitoh
  • ベストアンサー率30% (524/1722)
回答No.5

「C言語からlsコマンドを呼び出しても良い」という条件で開発するのなら、「C言語からfindコマンドを呼び出しても良い」筈ですよね。 だとしたら、C言語プログラムではreaddirもstatも行う必要はありません。 対象となりファイルリストはfindが作ってくれるので popen() して char filename[MAXPATHLEN+1]; while(gets(filename)) { do_something(filename); } というシンプルなプログラムで済みます。

SFdaisuki
質問者

お礼

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

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

#4 の「非常に時間を無駄にした」というのは, 「あなたの時間が無駄になったかどうか」ではありません. かなりずれた質問をしたために「他人の時間を無駄にした」ということを理解してください. ちなみに system("find ディレクトリリスト -mtime +183 -exec rm {} ;"); でも OK ですかねぇ>#4

SFdaisuki
質問者

お礼

回答が遅れて済みません。 こちらの方法でも動作可能と思います。 教えて頂き助かりました。 ありがとうございます。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.4

「半年以上古いファイルを消す」だったら、最初からそう書いてください。 「月の識別」と「半年以上古いか判断」では全然違います。 非常に時間を無駄にしました。 わざわざCでプログラムを作らなくても、 find ディレクトリリスト -mtime +183 -exec rm {} \; など、既存コマンドで済みます。

SFdaisuki
質問者

補足

>「半年以上古いファイルを消す」だったら、最初からそう書いてください。 言葉が足りず、失礼しました。 但し、これはコマンドラインで実行するのではなく、仕事上C言語で作成する必要があったのです。 ですから、無駄ではないはずです。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

まじめに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){・・・

SFdaisuki
質問者

補足

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

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

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

SFdaisuki
質問者

補足

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

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

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

SFdaisuki
質問者

補足

ご回答ありがとうございます。 実は対象ファイルの名称は特に決まっておらず、ファイル数も不特定であります。 ’ある月’を超えているファイルがあったら、そのファイルを処理対象にする、というのが今回のプログラミングの趣旨なのです。 statコマンドはよく知らないのですが、この条件でも対応可能でしょうか?

関連するQ&A

  • Linux ls -l について

    Linuxで「ls -l」を実行した時の一番上に出てくる合計とは何の事なのでしょうか? 調べてもよくわからないのでお手数ですがご存じの方教えて頂けると助かります。 例) 合計 4 ←この部分 -rw-r--r-- 1 xxxxxxx yyyyy 67 2月 27日 09:42 a -rw-r--r-- 1 xxxxxxx yyyyy 127 2月 27日 09:43 b

  • LinuxPCでルーターを作る

    質問のタイトル通りです。 SSD/LinuxでADSLルーターを作りたいのですが、 自分は、C言語でプログラミングをするのにLinuxを使用した経験しかありません。vi cd ls mv 等々基本的なコマンドは、知っています。 何かいい参考書ないでしょうか? お勧めのものがありましたら、教えてください。

  • " ls -l " から、指定縦列の中から、grepする方法

    SunOS 5.8 sun4u sparc UltraAX-i2 > ls -l -rw-r--r-- 1 root other 100 1月 1日 00:00 abc-1.txt -rw-r--r-- 1 root other 100 1月 1日 00:00 abc-2.txt -rw-r--r-- 1 root other 100 1月 1日 00:00 abc-3.txt -rw-r--r-- 1 root other 100 5月 11日 00:00 abc-11.txt -rw-r--r-- 1 root other 100 1月 12日 00:00 abc-12.txt -rw-r--r-- 1 root other 100 1月 13日 00:00 abc-13.txt -rw-r--r-- 1 root other 100 1月 1日 00:00 abc-5.txt -rw-r--r-- 1 root other 100 5月 1日 00:00 abc-6.txt -rw-r--r-- 1 root other 100 1月 1日 00:00 abc-7.txt -rw-r--r-- 1 root other 100 1月 1日 00:00 abc-51.txt -rw-r--r-- 1 root other 100 1月 1日 00:00 abc-61.txt -rw-r--r-- 1 root other 100 5月 1日 00:00 abc-71.txt ここから、" 5月 " のファイルのみを標準出力したいのですが、 日本語環境の不備から " ls -l | grep 5月 " のコマンドは刎ねられます。 ですので、策としては、以下のように ls -l ↓ 6列目(月列)を指定。 ↓ 5 を grep しなさい。 このように(sort +5)のような感じで、パイプをつなげたようなコマンドを用意したいのですが、 その機能が見つかりません。詳しい方、教えて下さい。 csh (bash使用可能) egrep,fgrep使用可能

  • DUとLSの表示の差

    ファイルのパーミッション等が下記の場合が関係しているのか不明ですがDUコマンドとLSコマンドで示されるDiskの使用量が一致しないのですが、理由を教えていただけませんか? % cd test001 % ls -l total 944 -rw-r-lr-- 1 own grp 524288000 Oct 15 09:12 File0 -rw-r-lr-- 1 own grp 524288000 Oct 15 09:11 File1 % % du 946 . % cd ../test002 % ls -l total 2049056 -rw-r-lr-- 1 own grp 524288000 Oct 17 14:12 File0 -rw-r-lr-- 1 own grp 524288000 Oct 12 21:16 File1 % % du 2049056 . DUの結果とLS -l で示される結果は一致しているのですが、ファイルサイズ(ls -lで示される値)の合計と一致しないのです。 OSはSolaris8です、よろしくお願いします。

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

    Linuxのtarコマンドについてわかる方がいれば教えてほしいです。 (tarコマンドというよりはLinuxの仕様かもしれません) Linuxで以下①パターンと②パターンでコマンドを実行したときに 指定の仕方でtarファイルの作成されるディレクトリが違うのですが なぜでしょうか。 Linux初心者なので詳しく教えていただけると助かります。 共通(前準備 (#はプロンプトです)) # DIR=/tmp/hoge/2021 # ls -l ${DIR} ~ test1.txt ~ test2.txt ~ test3.txt # cd ${DIR} ①パターン # tar -cvf ${DIR}.tar ./* (アスタリスクです) # ls -l /tmp/hoge ~ 2021.tar ⇒/tmp/hoge配下にtarができる ②パターン # tar -cvf 2021.tar ./* (アスタリスクです) # ls -l /tmp/hoge ~ 2021.tar ⇒/tmp/hoge/2021配下にtarができる

  • unixコマンドのawkについて

    uniコマンドのforやifなどは10行ほどで簡単な使用例をかけるのですか、awk簡単な使用例を教えて頂けませんか? 初歩的な質問んですいませんが、」よろしくお願いします。 できればc言語などを使わずに単体で使える方法をお願いします。

  • scpコマンドの-pオプションについて

    scpコマンドの-pオプションについて scpコマンド、(-p)オプションを付加しても ファイルのオーナ、グループが引き継がれません。 仕様なのでしょうか? ディストリビューションはRed Hat Enterprise Linux ESです。 よろしくお願いします。 ●コピー元 [root@moto tmp]# touch scp-test [root@moto tmp]# chown dbmgr:dba scp-test [root@moto tmp]# ls -l scp-test -rw-r--r-- 1 dbmgr dba 0 2月 16 15:01 scp-test [root@moto tmp]# chmod 777 scp-test [root@moto tmp]# ls -l scp-test -rwxrwxrwx 1 dbmgr dba 0 2月 16 15:01 scp-test [root@moto tmp]# [root@moto tmp]# scp -p scp-test saki:/tmp/ scp-test 100% 0 0.0KB/s --:-- ETA [root@moto tmp]# ●コピー先 [root@saki tmp]# ls -l scp-test -rwxrwxrwx 1 root root 0 2月 16 2005 scp-test [root@saki tmp]#

  • Bシェルのawkコマンドについて

    Bシェルのawkコマンドについてですが、例えばプロンプトから % ls -l hoge.txt | awk '{print $5}' と入力すると、hoge.txtのファイルサイズが出力されますが、同様のことをBシェルの中で行おうと思っています。 下記のように、配列arrayにはスペース区切りで3つのデータが入っており、N番目のデータを取得したいという場合に、Nに変数を使用して取得する方法がわかりません。 #!/bin/sh array="AA BB CC" num=3 # CCを取得したい echo $array | awk '{print $num}' 上記で実行すると、"AA BB CC"のようにすべて出力されてしまいます。awkで出力する箇所を${数値}で指定すればうまくいくのですが、ランダムで決めた数値(1~3)をnumに入れて取得したい場合、このようなことは可能でしょうか。 もし不可能な場合でも、awk以外に何かコマンドがあればご教授願います。なお、作成するのはBシェルになります。

  • プログラミングに適したフリーのテキストエディターはないでしょうか?

    フリーソフトなどで、C言語プログラミングを行いやすいテキストエディターなどはありませんでしょうか。 たとえば、 enum{ test1, test2, test3, } このようなエイリアス数値などを宣言していて、プログラミング中にステート状態などで#defineしている数値を使ったときに、マウスを当てれば、いくつの数値の別名なのかが表示されたり、変数名などが何で宣言したものなのかがすぐにわかるものとか、 それと、私はマイコンのプログラミングでC言語を使っているのですが、マイコン用のコンパイラを設定して、そのテキストエディタでコンパイルもできるようなソフトというのはないでしょうか?

  • makeコマンドができない

    基本的なことだと思いますがお願いします。 fedore core で色んなことをやってみようと思い sl を インストール していたのですがmakeができないのです。インストール通りにできないの はなんでですか? makeコマンドは /usr/bin にありました。 的はずれなこと言っていたらすみません。 [root@localhost sl]# ls -lrt 合計 36 -rw-r--r-- 1 3605 lock 4101 1月 19 1994 sl.h -rw-r--r-- 1 3605 lock 980 1月 19 1994 sl.txt -rw-r--r-- 1 3605 lock 689 1月 19 1994 sl.1 -rw-r--r-- 1 3605 36 417 7月 22 1998 README -rw-r--r-- 1 3605 36 331 7月 22 1998 Makefile -rw-r--r-- 1 root root 76 10月 31 2005 install.txt -rw-r--r-- 1 3605 36 7131 10月 31 2005 sl.c [root@localhost sl]# more install.txt 1. # tar xvf sl.tar 2. # cd sl 3. # make 4. # cp sl /usr/local/bin/ 5. # sl [root@localhost sl]# make cc -O -o sl sl.c -lcurses -ltermcap make: cc: コマンドが見つかりませんでした make: *** [sl] エラー 127

専門家に質問してみよう