• ベストアンサー

$マークの誤変換?について

指定パスのJavaのクラスファイルを圧縮し、圧縮ファイルをサーバに配置して解凍するシェルスクリプトを作成しています。 クラスファイルのパスは、 ------------------------------ /***/***/***$$1.class /***/***/***$1.class /***/***/***$test.class /***/***/***hogehoge.class …(以下略) ------------------------------ 上記のような記述形式で一覧にし、file.listというファイル名でシェルスクリプトと同じ階層に配置しております。 クラスファイルの中には、内部抽象クラスとなっているものもあり、 "$"がファイル名に含まれています。 このファイル群を、tarコマンドで圧縮するシェルスクリプトを作成したいのですが、 tar cf - `cat file.list` とすると、$が異なる文字列に変換されてしまい、 tar:/***/***/***$$2752111.class:No such file or directory とエラーログが出力され、正しいパスが取得できていないようです。 どのように修正すれば、$を含むファイル名も正しく取得できるでしょうか? お知恵をお貸しください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

sed で逃げるなら cat filelist.txt のところを sed -e 's/\$/\\$/g' filelist.txt にすれば $ の問題は解決します. 他のメタキャラクタも現れる可能性があるなら, いっそ sed -e 's/\([^a-zA-Z0-9\/]\)/\\&/g' filelist.txt かな. とはいえ, 今の状況では「(Gnu でない) tar を使う」のは少々荷が重いような気がします. cpio なども検討に入れた方が安全かもしれません.

paseri0903
質問者

お礼

ご回答ありがとうございます。 上記のように文字列置換を行いましたが、 どうしても置換後の文字:"\"が認識されません。。。 "\"の前に何か文字が必要だったりするでしょうか? cpioコマンドも検討してみます。 ただ、今回は既に稼働中のシェルスクリプトの不具合修正で、 今までに内部抽象クラスの不具合しか報告されていませんので、 とりあえずは tarとsedで逃げようかと思っております・・・。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

>どうしても置換後の文字:"\"が認識されません。。。 の意味がよくわからん (「認識」ってどういう意味?) のですが, 「$ を \$ にすること」についてはあれで OK のはずです. 少なくとも zsh と csh では問題なし. まあ, \ を 2個単位で増やしてみてください. 運がよければ, そのうちなんとかなります.

paseri0903
質問者

お礼

"\"を4個にすると、うまくいきました。 どのように置換されているのか頭の中で整理できていませんが。。。(汗) 丁寧に教えていただき、ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

私も jar の方が自然だと思いますが, Gnu tar なら -T で逃げることができるんではないかと. 他の tar は知りません.

paseri0903
質問者

お礼

ご回答ありがとうございます。 残念ながら、Gnu tarは使えませんでした。。。 オリジナルのtarには同様のオプションではないようです。 sedを用いて、$を\$としてエスケープしようかと考えております。 もし"sed"コマンドに詳しければ、再度お知恵をお貸しください。 よろしくお願いいたします。

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

JAVAのクラスファイルアーカイブを作成するなら、jarアーカイブするのでは駄目なのですか? unix/linus系OSと思われますが、$はshでは変数なので、変換されてしまっているのでしょう。 cat で変換されちゃうので、外部から制御は難しいんじゃないかと思います。 shタイプを変えてみるとひょっとしたらうまくいくかもしれませんが、 javaのクラスファイルアーカイブはjarコマンドを使うのが基本だと思いますので、再考してください。

paseri0903
質問者

お礼

ご回答ありがとうございます。 実は、tarはJavaのクラスファイル以外に対しても行っているので、 tar部分は変更できません。 そこで、sedを使って、file.listの"$"を"\$"と置換することにして 対処しようと思うのですが、シェル初心者のため、置換がうまくいきません。もし宜しければsedの記述方法を教えてください。 よろしくお願いいたします。

関連するQ&A