• ベストアンサー

-のついたファイル名を操作するには…

Sun OS 5.8を使用しています。不要なファイルを掃除しようとディレクトリー内を調べていると“-a"というファイル名のついたものが見つかりました。 内容を確かめようとcatやviコマンドで、ファイル名を-aとすると、シェルが-aを コマンドオプションと解釈していまい、うまく扱えません。このファイルの内容を見るにはどうしたらよろしいでしょうか?初歩的な質問で申し訳ありませんが、宜しくお願いします。ちなみにこのファイルはディレクトリーではありません。 一般のファイルで、私には読み書き実行の権限はあります。シェルはUnix標準のKshです。

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

  • ベストアンサー
  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

恐らくこういった形で出来ると思いますが…。 cat "-a" vi "-a" rm "-a" というようにダブルクォーテーションで括ってみて下さい。

kiroro302
質問者

お礼

naturalさん、早速のご回答ありがとうございます。実はこの方法を試してみたのですが、「オプションが正しくありません。使用法:cat[-usvtebn] [-|file]...」というエラーがあがってしまいます。ダブルクォーテーションで括ってみても、オプションコマンドが打ち消されていないようです。他に何かいい方法がありましたら、ご教授の程宜しくお願い致します。

その他の回答 (6)

  • ita3
  • ベストアンサー率67% (25/37)
回答No.7

すみません。削除する話ではなかったのですね。 申し訳ありませんでした。

  • ita3
  • ベストアンサー率67% (25/37)
回答No.6

以前のSolarisでは、rm に - というオプションが あって、そのものずばりの -がついたファイルを 削除するというものでした。 rm - -a という感じだったのですが、Solaris8 では使えなく なったのでしょうか?

kiroro302
質問者

お礼

ita3さん、アドバイスありがとうございます。Solarisでは - 単独のオプションというものがあるのですか。私はSolarisは未経験ですので、初めて知りました。 わたしは Sun OS なのですが、rm - -a(-と-aの間にスペースあり)rm --a(スペースなし)どちらも「オプションが正しくありません」という返事が返ってきてしまいます。なかなか難しいですね。貴重な情報ありがとうございました。

  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.5

No.4 の回答と似たような話ですが、こんな方法もあります。   if (X$1 == Xstring) then つまり、頭に X を付けることによって例えば -d は X-d となり、普通の文字列として判定できるというわけです。 この手法は、昔から結構よく見かけますよ。

kiroro302
質問者

お礼

ysk6406さん、ご回答ありがとうございます。シェルはまだまだ勉強不足で皆様の貴重な知識はすべて糧になります。なるほどですね。参考にさせて頂きます。もっともっと勉強しなくては!!がんばります。

回答No.4

シェルスクリプトを作ってらっしゃるということで、 もしかしたら、私のつまずいたところ同じじゃないかなと思って、 アドバイスに来ました。 #以下のサンプルは、cshスクリプトの書き方をしていますが #ほかのシェルでも基本的に同じ動作だと思います。 if ( $1 == string ) という書き方をしていると、 たとえば、引数に "-d" が来たときに、 if ( -d == string ) と展開されて、== がディレクトリかどうかを返す式になってしまいます。 $1 と string を文字列として比較したいときには、 if ( "$1" == string ) とすると、"$1" は文字列として解釈されます。 私の経験上、引数の処理で苦労したので、書かせてもらいました。 関係なかったら読み飛ばしてください。

kiroro302
質問者

お礼

cherry moonさん、貴重なアドバイスありがとうございます。おっしゃるとおり、まさに引数として-aを渡すと、シェルが思いもかけない解釈をしてしてしまい、とても困りました。-を文字列の一部として解釈させる方法は意外といろいろあるのですね。とても勉強になりました。何か問題にぶつかるとそれを解決しようとする時に思わぬ副収入が得られて、とてもやりがいがありますね。また、初歩的な質問をしてしまうかもしれませんがその際にはどうか宜しくお願い致します。

  • 2nd
  • ベストアンサー率30% (19/63)
回答No.3

既に解決されているようなので蛇足になりますが、 そういった場合の正攻法(?) を紹介しておきます。 % cat ./-a こうすれば間違いなくアクセスできます。 「./」を用いて、相対パスでファイルを指定してやることで 「-」つきであろうとなかろうと、きちんとファイル名として 認識させてやることができます。 同様に、絶対パスでファイルを指定してやっても問題なくアクセスできます。

kiroro302
質問者

お礼

2ndさん、ご回答ありがとうございます。早速試してみました。なるほどです。 パスでファイル名を指定すれば「-」そのままファイル名の一部となるわけですね。バスにオプションなんて無いですものね。大変勉強になりました。いま、会社ではじめてのシェルスクリプトに挑戦しています。難しいです。最初から行き詰まっています。いろいろがんばってみているのですが、どうもうまく動きません。 どうしても解決できなかったら、またこちらで質問したいと思います。その際にはどうぞ宜しくお願い致します。

  • CueCue
  • ベストアンサー率40% (86/214)
回答No.2

どうしてもその名前で扱いたいとなると不明ですが。 一度mvコマンドで名前を変えてから参照してはいかがでしょう。 例:ファイル'-a' を 'ab' に変える。 % mv -- -a ab mvやrmコマンドは、オプション '--' をつけると'-'で始まる名前をファイル名としてくれます。

kiroro302
質問者

お礼

CueCueさん、早速のご回答ありがとうございます。できました!! mv,rm,vi,catコマンドにおいて試してみましたが、きちんと'-’をファイル名の一部として解釈してくれました。大変助かりました。ありがとうございます。

関連するQ&A

  • scriptコマンドによる操作ログの取得について(編集履歴まで)

    サーバーの運用を行うにあたり、シェルや、ファイルの書き換えの際に、変更履歴を把握したいと考えています。 UNIX/Linuxであれば、OS側の「script」コマンドで、ある程度の操作をログとして取得できますが、vi等で編集した内容までは、ログとして取得できません。(viを利用して編集した、までです) そこで、catコマンドで表示した内容が、ログとして取得できることに着目しています。 勉強不足で申し訳ありませんが、たとえばviで編集を完了後に、かならずcatを自動的に発行するようなことは可能でしょうか? (理想は、ユーザに見えないように編集内容をログ取得することですが、さすがにバックグラウンドで変更内容を取得することは難しいと思っています。) 上記が実現可能であった場合、編集内容なども一つのログファイルから追えるため、非常に便利(安易な考えで申し訳ありませんが)だと考えております。 お手数ですが、ご協力いただければと思います。 以上、よろしくお願いします。

  • ファイルの行数カウントについて

    unixないのあるファイルの行数をカウントするコマンドまたは シェルはないでしょうか? 理想としてはあるディレクトリにあるファイルのすべての行数を一度に 確認したいのですが。。 どうぞよろしくお願いいたします。

  • cat でファイルの拡張子を指定

    基本的なことで申し訳ないんですが、 UNIXのcat コマンドでファイルの中身を出力するときに、カレントディレクトリでないファイルを出力するには、パスも書きますよね。 cat パス/ファイル名 catでパスを指定して使うときに、 パスを繰り返し書かないで、 (その指定したディレクトリ直下だけでいいので)複数の特定の拡張子のファイルのみ出力するには、どうすればよいのですか? 例えば、 拡張子が、cとcsとtxtのファイルだけ出力して、その他のファイルは出力しない というようなときです。 既に書いたとおり、パスは繰り返して書かないので、 cat パス/*.c パス/*.cs パス/*.txt のようなものはナシということでお願いします。

  • 最終行をファイルを開かずにカットする方法はありますか?

    UNIXのviでファイルを開くと最終行が不完全といわれてしまいます。最後に半角スペースと変な文字が入っているようです。 viエディタのコマンドで、DDを押し最終行を手動でカットすると直るのですが、 Cやシェルなどで最終行をカットする方法はありますでしょうか?

  • Unix:ls-lRのリダイレクト

    kshで、ls-lRのコマンドを使い表示したディレクトリの内容を、新規のディレクトリ内のファイルに下記のようにリダイレクトさせようとしましたが、ファイル作成できませんでした。 ls-lR >>$HOME/test/apple cat | ls-lR >> $HOME/test/apple どうすれば、ls-lRの内容をファイルに表示できますか?

  • ファイル転送が完了したことを判定する

    UNIX上のシェルにて、大容量のファイル転送が完了したかどうか判定する方法はないでしょうか?test -r $対象ファイル をすると転送中でも読み取り可能となってしまい、ファイルが転送完了したか判断できません。wcコマンドやcatコマンドを使用すると一応エラーではかえってくるのですがそんな方法しかないのかな?と疑問を感じています・・・。

  • vi操作でクラス、関数、変数を追いかける。

    皆様へ いつも、お世話になっております。 この度は、vi操作についてのご質問です。 ・質問内容 Vi操作にて、変数名や関数名やクラス名がどこで定義されているのかを検索し、 そのファイルを開く一連の動作をすばやく行いたい ・環境 CentOS5.8に対してSSHで接続を行っています。 出来れば、ユニックスコマンドとvi操作で行いたいと考えています。 ・現状 :!find ホームディレクトリ -name ファイル名 -exec grep 関数名 {} \; :tabnew ホームディレクトリ/見つけたファイル名 といったような方法でファイルを開いていますが、 関数名で検索すると莫大な検索量になってしまい、取捨選択が大変です、 またファイルを開くのも一苦労です。 何か良い案は御座いませんか? お願いします。

  • kshについて

    現在AIXなどのUNIX系のシステムの運用(AIXがほとんどです。)をやっているものです。 AIXのコマンドを勉強しようと思い、その一環でというか、シェルを作ったり、作られたシェルを 解析することでコマンドの勉強になると思い、シェルについて勉強しようと思っています。 そこで、シェルについての本を探しているのですがどのような本が良いでしょうか? 皆さんが実際に読んでみてよいと思った本を教えてください。 ちなみにkshです。 探してみたのは、 入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界 ブルース ブリン (著) UNIXシェルスクリプトハンドブック 関根 達夫 (著) です。 よろしくお願いします。

  • unixでファイルの中身をコピーしたらサイズが変わりました・・・

    すいません。UNIX初心者です。 unixでAというファイルをcatコマンドで全部表示させ全コピーし 別のウィンドウにviで貼り付け、Bというファイルを作ったのですが 何故かファイルサイズが変わってしまいました。 cp -pでは変わらないのですが・・・ sdiffでAとBを比較したら何も差分はなかったのですが、 diffで比較すると一部を除いて差分が出てきたのですが、見た目どこに差分があるのかわかりません。スペースか何かか?と思ったのですが、肉眼で確認する限り違いがあるようには思えません。 unixの端末からftpでwindowsの端末にファイルを転送したときも同じようにファイルサイズが変わってしまいました。。。 二回目やったら何故かファイルサイズ変わらず成功しましたが。 すいません、考えられる可能性を教えていただけますでしょうか

  • Linuxで標準出力したファイルの文字コードついて

    Linuxで2つのディレクトリの内容をtreeコマンドでそれぞれファイルに出力して、 その2つのファイルをdiffで比較して、その結果をファイルに出力するシェルを作成しました。 比較対象のディレクトリの内部には日本語でファイル名やディレクトリ名を付けているものもあります。 このシェルを手動で実行してファイルに出力された内容を確認すると、 日本語であるべきところは日本語で出力されています。 nkfコマンドでファイルの文字コードを確認すると「UTF8」となっています。 しかし、cronにてこのシェルを実行してファイルに出力された内容を確認すると 何故か日本語の部分が化けて(ASCIIのようです)しまいます。 nkfコマンドでファイルの文字コードを確認すると「ASCII」となっていました。 cronで実行した場合にも出力するファイルの文字コードを「UTF8」にしたいのですが どいうすればよいでしょうか? どなたかご教授願います。 よろしくお願いします。