• ベストアンサー

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

指定パスの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

  • ftpASCIIモードをbinaryに変換にしたい

    こんにちは 今本来バイナリーとしてダウンロードすべきファイル(hogehoge.tar.gz)を ASCIIモードでftpで取得してしまいました。 元ファイルを消してしまったので、今はそれをgz+tarで解凍しようとしても エラーが出てしまいます。 このファイルをASCII ->binaryファイルに戻す方法はないでしょうか? (多分改行コードや、文字コードを変換すればいいと思うのですが・・・) シェルスクリプトでも、プログラムでもLINUX、WINDOWS、MACで動くものなら もんだいありません。 よろしくお願い致します。

  • シェルスクリプトの自動化で動作が変なのですが・・・

    いつも大変お世話になります。 シェルスクリプトでtarコマンドを書き、このファイルをcrontabで自動化しております。 設定した時間になるとcrontabが実行され、ファイルが生成されるのですが、ファイル容量が少なく、tarコマンドがきちんと実行されていない様なのです。 あるディレクトリをまるごと圧縮しているのですが、容量は1GB程あり、これを tar czvf /directory_name1/file_name1.tar.gz /directory_name2/ というコマンドで圧縮しております。 直接このコマンドを実行するとちゃんと圧縮され、約940MBの容量になります。しかし、crontabでシェルスクリプトを実行すると45バイトのファイルが生成されて終ってしまいます。 なぜなのか、さっぱり原因が分かりません。 どなたかご教授の程、何卒、宜しくお願い致します。

  • シェルスクリプト 自身のファイルパスを取得する方法

    基本的なことかもしれないのですが、教えて下さい。 シェルスクリプトをLinuxで作成しています。 シェルスクリプトを実行して、実行したスクリプトまでの絶対パスを取得したいのですが、方法がわかりません。 いろいろ調べて、 dirname $0 という方法で出来るような記述も見つけたのですが、$0ではスクリプト名を取得することしか出来ず、ファイルパスを取得することが出来ませんでした。 OS : Linux カーネル : 2.6 です。 他に必要な情報があれば教えて下さい。 よろしくお願いいたします。

  • cronから起動したシェルスクリプト内のtarが作動しない

    シェルスクリプトの中で、フォルダを圧縮するため tar -cvzf ~ しています。このシェルをroot権限cronで毎日動かしたいのですが、試したところ、正常に圧縮されません。 名前だけは存在するのですが、ファイルサイズが20byteしかありません。 シェルスクリプトを手動で起動させた場合は正しく圧縮できます。圧縮されたファイルも1Gありました。 以前、どこかのMLにて同様の報告があり、root宛てのMailを確認するように、というアドバイスまでは乗っていたので、確認したところ、root宛てにメールが来ていませんでした。 対処方法をお教えください。

  • 任意のフォルダ内の画像をランダムに呼び出し、ランダムに配置するには?

    任意のフォルダ内の画像をランダムに呼び出し、ランダムに配置するには? よろしくお願い致します。 jQueryを使用して、複数の画像をランダムに配置する(読み込むごとに)というページを作成しております。 この場合、予め配置した画像の表示順番をランダムに変えるだけなので、任意のフォルダに数十枚の画像を入れておき、そこからランダムに数枚の画像を呼び出し、かつランダムに表示順番を変えることはできないものでしょうか。 例:images というフォルダに50枚の画像を入れておき、その中から10枚の画像をランダムに呼び出し、かつランダムに配置する。 いろいろ調べてみたのですが、知識が足りず理解出来なかったため質問させて頂きました。 お詳しい方がいらっしゃいましたら、どうかご教授頂けると幸いです。 ■現在のコードです。 <html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> function shuffle(list) { var i = list.length; while (i) { var j = Math.floor(Math.random()*i); var t = list[--i]; list[i] = list[j]; list[j] = t; } return list; } $(function() { $('#sbox').append(shuffle($('.hogehoge', '#box'))); }); </script> </head> <body> <div id="box"> <div class="hogehoge"><img src="1.jpg"></div> <div class="hogehoge"><img src="2.jpg"></div> <div class="hogehoge"><img src="3.jpg"></div> <div class="hogehoge"><img src="4.jpg"></div> <div class="hogehoge"><img src="5.jpg"></div> </div> </body> </html>

  • bashのwhileとshiftについてです。

    いまシェルスクリプトで引数に複数のファイルの絶対パス(複数)を受け取り、それらのファイルを順番に処理しwhileを使い、引数の個数が0より大きいなら、以下の処理を繰り返します。 以下の処理(*1)というのは シェルスクリプトの引数にファイルの絶対パスを受け取り、そのファイルの行数を数えます。 受け取った絶対パスのなかか らファイル名だけを取り出し、その後ろに、_行数を追加したファイル名を作ります。 もとのファイルを、現在居る場所に、新しく作った ファイル名でコピーする。 そしてそのファイルが10000バイト以上なら、コピーしたファイルをgzipで圧縮する。 というものです。こちらはできたのですがwhileとshiftの所が出来ません。 自分が書いたシェルスクリプトを実行すると "syntax error near unexpected end of file というエラーが出てきます。このエラーは最後がしっかり閉じれていないということでしょうか? またシェルスクリプトはこのように書きました。 >while [$# -le 0] >以下の処理(*1) >shift >fi こちらの書き方であっているでしょうか?

  • AIX kshスクリプトのtar+compressを1行で書く方法について

    こんにちは。はじめまして、hisatoと申します。 AIX kshスクリプトのtar+compressについて 質問がございます。 基本は下記の通りで問題なく完了するのですが、 # アーカイブ処理 tar -cvf - <固める対象のファイル名> | compress >圧縮ファイル名.tar.Z 下記の処理にすると、エラーが発生してしまいます。 tar -cvf - -L <固める対象のファイル名リスト> | compress >圧縮ファイル名.tar.Z tar: 次のフラグにはパラメータが必要です: L 使用方法: tar -{c|r|t|u|x} [-BdFhilmopsvw] [-Number] [-fFile] [-bBlocks] [-S [Feet] [Feet @Density] [Blocksb]] [-LInputList] [-NBlocks] [-C Directory] File ... -Lを使用する場合は、-オプションを使用して新規アーカイブ・ファイルを作成し、 そのアーカイブ・ファイルをcompressに渡すことはできないのでしょうか? 以上、ご教授お願いいたします。

  • デーモンを自動起動→tar解凍が行えない

    RHEL3を使っています。 とあるデーモンを起動するスクリプトを/etc/rc.d/init.d/に配置し、 chkconfig --addで登録してOS起動時にデーモンが自動起動するようにしています 更に、そのデーモンプロセスからシェルが実行されるのですが そのシェルの中でtar -xvf コマンドでtarファイルを解凍しようとしたとき 解凍が行えず、シェルスクリプトの動作もそのまま止まってしまう現象が発生しています。 現在確認している限りでは、デーモンの起動、シェルの起動は問題なく行えています。 また、デーモンを手動で立ち上げなおせば、tar解凍は問題なく行えるようになります。 以上の現象について、原因、解決方法など 何か情報がありましたら教えていただきたく、宜しくお願いします。

  • ttlマクロによるディレクトリ配下の取得

    シェルスクリプトで、apacheのhtmlディレクトリを取得しバックアップを作成しております。 シェルスクリプトは、ユーザshコマンドによる実行です。(cronでは動かしておりません。) 保存先:/home/test/html_backup/配下 保存ファイル名:yyyymmdd.tar.gz(yyyymmddシェルスクリプト実行日となる。) よって、/home/test/html_backup/ディレクトリ配下にある複数のバックアップ全てを、 マクロによるscp転送で取得したいと考えています。 同名ファイルが存在する場合は、常に上書きでかまいません。 サーバに接続後、下記コマンドを実行しようと思いました。 wait '$' scprecv '/home/test/html_backup/*' scprecv '*' 'c:\temp' としましたが、うまくマクロが動きません。 sendlnでファイル転送ができることはわかりましたか、 今回やろうとしていることは、複数のバックアップファイルがあるため 自動でsendlnでは難しいと思っております。 どのようにttlを書けば バックアップファイルを全部取得できるのでしょうか。 ご教授お願いいたします。

  • prototype.jsにて

    hoge = Class.create(); hoge.prototype = { 省略.... } hogehoge = new Test(); Testクラスの中で、 「hogehoge」というインスタンス名を取得することは可能でしょうか?

専門家に質問してみよう