メッセージ。 - ファイルを新しい順にリストアップしたい(絶対パス付きで)

# ファイルを新しい順にリストアップしたい(絶対パス付きで)

あるディレクトリに存在するファイルのうち、新しいものにgrepコマンドをかけたい場合、どうすればいいの? 「最近使ったファイルのほうが、価値が高い」メソッドで、ファイルを探そうとしているのだけど、うまくいかない……。

新しいファイル100件の「ファイル名」をリストアップして、それをgrepの引数に渡すだけなんだけど……。「ファイル名」をリストアップするときに、lsコマンドでは絶対パスをうまく作れない(findを使えばよさそうだけど、「あるディレクトリ」にはファイルがたくさんありすぎるので、検索に余計な時間のかかるfindを使いたくないのです)。

  $ for i in `ls -t ~/repository | head -100`
  do
    grep "test" ~/repository/${i}
  done

でうまくいきそうなのに、ダメ。
 grep: /home/fujisawa/repository/1141380955.0: そのようなファイルやディレクトリはありません
 grep: /home/fujisawa/repository/1141380954.0: そのようなファイルやディレクトリはありません
みたいに言われる。どうもgrepコマンドを実行する前に、~/repository/ と ${i}の展開・結合処理をしてくれていないみたいなんだよなぁ。

しかたないから、とりあえずGaucheで書くけど。
  #!/usr/bin/env gosh
  (use util.list)       ;; take*
  (use file.util)       ;; directory-list
  
  (define (usage)
    (display "USAGE: lsrecent.scm directory\n" (current-error-port))
    1)
  
  (define (lsrecent dir num)
    (for-each
     (lambda (e) (print e))
     (map (lambda (e) (cdr e))
          (take* (sort (map (lambda (file)
                              (cons (file-mtime file :follow-link? #t) file))
                            (directory-list dir :children? #t :add-path? #t))
                       (lambda (x y) (> (car x) (car y))))
           num)))
    0)
  
  (define (main args)
    (let1 num 100
      (if (= (length (cdr args)) 1)
          (lsrecent (cadr args) num)
          (usage))))

これをlsrecent.scmというファイルに保存して「chmod u+x ./lsrecent.scm」。次のように実行する。
$ ./lsrecent.scm ~/repository/ | xargs grep "test"

ふぅ。1時間ぐらいかかったかな? lsにオプションが1つあれば済むのに……(とかいいつつ、本当はきっともっと、うまい方法があるんだろうなぁと思う)。
2006-03-09 16:21:53 / ふじさわ / Comment: 0 / Trackback: 0

Comment

コメント投稿機能は無効化されています。

Trackback

TrackBack投稿機能は無効化されています。