もしかすると当たり前のことかもしれませんが、フィーリングで調べても答えがなかなか見つからなかったので備忘目的でメモします。
事の起こり
unzipコマンドで特定のファイルのみを解凍したい時
下記のようなzipファイルがある場合
hoge.zip
$ zipinfo -1 hoge.zip
aaa/bbb/ccc.txt
ddd/eee/fff.jpg
ggg/hhh/iii.log
unzip {解凍対象zip} {取り出したいファイルパス} で実現できる。
$ unzip hoge.zip aaa/bbb/ccc.txt
がしかし、zipファイル内のディレクトリの区切りがバックスラッシュであった場合
hoge_bs.zip
$ zipinfo -1 hoge_bs.zip
aaa\bbb\ccc.txt
ddd\eee\fff.jpg
ggg\hhh\iii.log
同じ調子でコマンドを入れるとエラーになってしまう
$ unzip hoge_bs.zip aaa\bbb\ccc.txt
Archive: hoge_bs.zip
caution: filename not matched: aaabbbccc.txt
#試行錯誤
シングルクォートで囲めばいいのか?と思うもこれもダメ
$ unzip hoge_bs.zip 'aaa\bbb\ccc.txt'
Archive: hoge_bs.zip
caution: filename not matched: aaa\bbb\ccc.txt
実は展開時にパスがスラッシュに変換されているのか?と試してみるもこれもダメ
$ unzip hoge_bs.zip 'aaa/bbb/ccc.txt'
Archive: hoge_bs.zip
caution: filename not matched: aaa/bbb/ccc.txt
上手くいった方法
バックスラッシュを2つにしてあげると上手くいきました
$ unzip hoge_bs.zip 'aaa\\bbb\\ccc.txt'
Archive: hoge_bs.zip
warning: hoge_bs.zip appears to use backslashes as path separators
inflating: aaa/bbb/ccc.txt
こうやってまとめてみると、これって常識なんじゃないかと反省し始めています……