この記事は何
shellgei160を通じて言語習得 Advent Calendar 2023に参加しています。
書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。
例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160
実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に
answer-ruby
ディレクトリを作り、その中に解答となるファイルを作成していきます。
今回のテーマ
$ find -type f | grep -v "\./dir_b/d" | sort
指定したフォルダ内を再帰的に探査し、ディレクトリは含めず、./dir_b/d
というパターンにマッチしないファイルだけを一覧にする処理です。
解
target = 'qdata/21'
exclude = File.join(target, 'dir_b/d')
# 再帰探索のために**/*を使う
puts Dir.glob("#{target}/**/*").reject { |f| File.directory?(f) || f.match(exclude) }.sort
所感
- 再帰探査には
/**/*
を使う - ディレクトリかどうかは
File.directory?
でOK - 条件に当てはまらない場合、には
reject
が読みやすくて良いね