面倒くさいんですよ。
ファイル名に [] ブラケットが混ざるととても扱いが面倒くさい。
以下の様なファイル構造があるとする。
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 }
あーめんどくさい