それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby で[] のブラケットが入った文字列を扱うととてもめんどくさい。

面倒くさいんですよ。

ファイル名に [] ブラケットが混ざるととても扱いが面倒くさい。

以下の様なファイル構造があるとする。

takuya@~/Desktop$ tree '[資料]授業資料'
[資料]授業資料
└── a
    └── b

たとえば、globする場合

>> Dir.glob '[資料]授業資料/*'
=> []

glob の マッチの文法に、[set] が含まれるので、どうしようもない。

たとえば、exec するばあい

takuya@~/Desktop$ irb
>>
>> cmd = "ls '[資料]授業資料' '[資料]授業資料-01' "
ls: cannot access '[資料]授業資料-01': No such file or directory>> cmd
=> "'mv [資料]授業資料' '[資料]授業資料-01' "
>> exec cmd
sh: [資料]授業資料: command not found

mv だけダメなんですよ。

ls なら出来る。

>> cmd = "ls -l '[資料]授業資料' "
=> "ls -l '[資料]授業資料' "
>> exec cmd
total 0
drwxr-xr-x 3 takuya staff 102  8  9 00:15 a

shellwords でエスケープするともうメチャクチャ

utf-8 の日本語全てがエスケープされちゃいましたよ。もうどうしろというのか

>> cmd = 'mv ' + Shellwords.escape('[資料]授業資料') + '  ' + Shellwords.escape('[資料]授業資料-01')
=> "mv \\[\\資\\料\\]\\授\\業\\資\\料  \\[\\資\\料\\]\\授\\業\\資\\料-01"
>> print cmd
mv \[\資\料\]\授\業\資\料  \[\資\料\]\授\業\資\料-01=> nil

結論:逐次置換しかかない

Stackoverflowとかも一応見てみたけれど、逐次置換するしか無いっぽいぞ。

Rubyのこのあたりの文字コードと、文字列の扱いは本当にひどいと思う。

このように、ファイルに含まれるglob文字列を展開する必要がありそうだ

file_name.gsub( %r'[\{\}\[\]\*\?\\]' ) {|c| '\\'+c }

あーめんどくさい