メッセージ。 - ファイルを新しい順にリストアップしたい(絶対パス付きで)
# ファイルを新しい順にリストアップしたい(絶対パス付きで)
あるディレクトリに存在するファイルのうち、新しいものにgrepコマンドをかけたい場合、どうすればいいの? 「最近使ったファイルのほうが、価値が高い」メソッドで、ファイルを探そうとしているのだけど、うまくいかない……。
新しいファイル100件の「ファイル名」をリストアップして、それをgrepの引数に渡すだけなんだけど……。「ファイル名」をリストアップするときに、lsコマンドでは絶対パスをうまく作れない(findを使えばよさそうだけど、「あるディレクトリ」にはファイルがたくさんありすぎるので、検索に余計な時間のかかるfindを使いたくないのです)。
$ for i in `ls -t ~/repository | head -100`
do
grep "test" ~/repository/${i}
done
でうまくいきそうなのに、ダメ。
しかたないから、とりあえず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つあれば済むのに……(とかいいつつ、本当はきっともっと、うまい方法があるんだろうなぁと思う)。
新しいファイル100件の「ファイル名」をリストアップして、それをgrepの引数に渡すだけなんだけど……。「ファイル名」をリストアップするときに、lsコマンドでは絶対パスをうまく作れない(findを使えばよさそうだけど、「あるディレクトリ」にはファイルがたくさんありすぎるので、検索に余計な時間のかかるfindを使いたくないのです)。
$ for i in `ls -t ~/repository | head -100`
do
grep "test" ~/repository/${i}
done
でうまくいきそうなのに、ダメ。
みたいに言われる。どうもgrepコマンドを実行する前に、~/repository/ と ${i}の展開・結合処理をしてくれていないみたいなんだよなぁ。grep: /home/fujisawa/repository/1141380955.0: そのようなファイルやディレクトリはありませんgrep: /home/fujisawa/repository/1141380954.0: そのようなファイルやディレクトリはありません
しかたないから、とりあえず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つあれば済むのに……(とかいいつつ、本当はきっともっと、うまい方法があるんだろうなぁと思う)。
Comment
Trackback