Filesystem in Userspace (FUSE) を使って以下の仕様のファイルシステムを実装します。
- 各ディレクトリには「ズン」「ドコ」というディレクトリか、「キ・ヨ・シ!」というファイルがひとつだけある
- 「ズン」「ドコ」のディレクトリはランダムでどちらかひとつだけが出現する
- パスが「/ズン/ズン/ズン/ズン/ドコ」なディレクトリの中には「キ・ヨ・シ!」というファイルが出現する
今回はRubyとgemのrfusefsを使って作ります。
zundoko_fs.rb
#!/usr/bin/ruby
# -*- encoding: utf-8 -*-
require 'fusefs'
class ZundokoFS < FuseFS::FuseDir
def contents(path)
if path =~ /\/ズン\/ズン\/ズン\/ズン\/ドコ$/ then
[ 'キ・ヨ・シ!' ]
else
[ ['ズン', 'ドコ'].sample ]
end
end
def directory?(path)
path =~ /\/(ズン|ドコ)$/
end
def file?(path)
path =~ /\/キ・ヨ・シ!$/
end
end
if (File.basename($0) == File.basename(__FILE__)) then
if ARGV.size != 1 then
puts "Usage: #{$0} <directory>"
exit
end
dirname = ARGV.shift
unless File.directory?(dirname) then
puts "Usage: #{dirname} is not a directory."
exit
end
FuseFS.set_root(ZundokoFS.new)
FuseFS.mount_under(dirname)
FuseFS.run
end
実行結果
% mkdir zundoko
% sudo ./zundoko_fs.rb zundoko &
% ls -l zundoko
合計 0
dr-xr-xr-x 1 root root 0 1月 1 1970 ドコ
% ls -l zundoko
合計 0
dr-xr-xr-x 1 root root 0 1月 1 1970 ズン
% find zundoko
zundoko
zundoko/ドコ
zundoko/ドコ/ズン
zundoko/ドコ/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ
zundoko/ドコ/ズン/ズン/ドコ/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン/ズン/ドコ
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン/ズン/ドコ/キ・ヨ・シ!