• ベストアンサー

マルチバイトファイル名のファイルが消せない

ホストはHP-UXでコードはEUCの設定になっています。 誤って、SJISファイル名のファイルをホストに作成してしまったため、ファイルを消そうと思います。 testというディレクトリにEUCファイル名・SJISファイル名のファイルが混在した状態で、rm -rf test/* (シェルは/bin/sh)を実行したところ、見事にSJISファイル名のファイルが削除できませんでした。 シェルをcshに変更したところ、今度は削除できました。 *で削除しているので全て削除可能なのでは、と思うのですが、削除できない理由は何なのでしょうか。 ファイル削除手段の方法はとりあえず分かりました(シェルを変更して削除)ので、向学のため理由が知りたいです。

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

Shift-JISの文字体系にはシステムが利用するコード(例:チルダ ~ 等)が含まれるためです。 たとえば「鯨、救、樫、×」等はチルダと同じ「0x7E」が後のバイトに付きますがUNIXでチルダはホームディレクトリを表します。 文字体系の問題以外にはファイル名にこんな文字使ったらイケンという文字を堂々と使う超ど級の素人方がいらっしゃいます。 スペースとかスラッシュ(マカーに多い)とか、何じゃこりゃーというファイルが届いて開くことが出来んというケースが・・・ スペースが(使えるのに)なぜいけないかという理由の例: UNIXでテキストファイルを表示する時の例  cat ABC DEF.txt だと明白ですよね。 命令は 「ABC」というファイルと「DEF.txt」という2つ別々のファイルとして認識します。 cat "ABC DEF.txt" とすると使える場合も有りますが・・・ 通常スペースは命令を与える場合の「パラメータの区切り」として利用されるのが一般的だからです。

nishimry
質問者

お礼

回答ありがとうございました。 よく考えたら、そうですよね。スペースとか入ると、別ファイルですよね。 シェルによる動作の違いはそれとして、次から気をつけて生きたいと思いました。

その他の回答 (1)

  • takapiii
  • ベストアンサー率55% (944/1707)
回答No.1

アスタで全削除は怖いのでは? 別のディレクトリで、コマンドの履歴からうっかり実行って事あります。 i-nodeで消せばいいのではないでしょうか。 ls -i でi-nodeを確認して、 find . -inum i-node番号 -exec rm {} \; 消せない理由は文字コードが違うからです。

nishimry
質問者

お礼

i-nodeによる削除もできたのですね。 今まで使ったことがありませんでしたので勉強になりました。 ありがとうございます。 ”消せない理由=文字コード”は、理屈では分かっているのですが、なぜコードが違うと消せないのか?が知りたかったです。(ファイル名にスペースが入るから?・・・)

関連するQ&A

  • ファイル名の文字コード

    LinuxサーバにWindowsよりFTPで日本語ファイルの ディレクトリやファイルを大量にアップロードしました。 どうやらファイル名がsjisでアップロードされてしまったみたいで Linux上から見るとすべて文字化けしています。 ディレクトリ名とファイル名をsjisからeucへ 変換する方法はあるのでしょうか? よろしくお願いします。

  • 古いファイルを削除したいのですが。。。

    こんにちわ。 findコマンドを使って、あるディレクトリにどんどんできるファイルの古くなったものを削除したいのです。 例えば、7日以上更新がないものを削除したく、 # find /hoge/backup -mtime +7 -a -type f -exec rm -f {} \; というコマンドを実行してみましたが、結果は、削除されず残ったままで、しかも一部のファイルが元々古い日付だったものが、実行日時でタイムスタンプが書き変わってしまってます。 シェルはbashでもcshで試しても同じでした。 どうすればよいかご教示お願いできますでしょうか?

  • system関数で呼びだした、cshファイル周辺でのエラー

    2~3日前にも質問させていただいた、Perl初心者leeeeeeeeです。先日に引き続き、前の業者が作ったPerlプログラムを、新しいサーバ上で動くようにする作業を行っているのですが、まだエラーが出ており困っています。以下が問題の部分です。 ○○.cgi # 削除シェルの実行 $rtn = system"$rm_csh $tmp_file $limit_date $touch_file"; if($rtn != 0) {  # エラーログ出力  cm_errlog(__FILE__, "LOG013", ($rm_csh." ".$limit_date));  # エラーHTML出力  省略  # 異常終了  exit 1; } ここの、$rtnが、0になっていないようで、エラーページが表示されてしまいます。 ちなみに、$rm_csh は、tmpdel.cshというファイルで、以下が中身です。 ■ tmpdel.csh #!/usr/bin/csh set touch_fname = $3 set tmp_file = $1 touch -t $2 $touch_fname >& /dev/null set STS = $status if( $STS != 0) then exit 1 endif foreach file_name (`ls $tmp_file*`)  test $file_name -ot $touch_fname && rm $file_name >& /dev/null end exit 0 ■ tmpdel.csh の #!/usr/bin/csh という部分が気になって、#!/usr/bin/perlとか、 #!/bin/cshにもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • Solarisで0byteのファイルのみ削除したい

    Solaris11.3環境です。 以下のような構成のディレクトリがあるとします。 ---------------------------------------------- /var/tmp/KOTEI/END/ /var/tmp/組織コード/END/ ---------------------------------------------- この配下にシステムでファイルが大量に作成されるのですが、その中には0byteのファイルも含まれます。 この0byteファイルが1ヶ月で10万個近く溜まってしまうので、シェルで自動削除しようと考えています。 ファイル名に関わらず、0byteファイルは全て削除します。 以下のようなコマンドを考えたのですが、問題ないかご意見いただけないでしょうか? ---------------------------------------------- find /var/tmp/KOTEI/END -size 0c -exec rm {} \; find /var/tmp/*/END -size 0c -exec rm {} \; ---------------------------------------------- 一番怖いのは、0byteでない、データが含まれているファイルも誤って削除してしまうことです。 また、組織は変更になる可能性があるため、"*"にすることで対応できているか不安です。 是非アドバイスの程、よろしくお願い致します。

  • ファイル名に日付・時刻を付与したい

    Cプログラミングの経験はあるのですがperlのソースを初めて 改造することになりました。 変数「$i」にはシェルのファイル名が入ります。 #FS000.csh このファイル名に日付・時刻を付与して、 FS000mm(月)dd(日)hh(時)mm(分)ss(秒).csh というファイル名にしたいのですが、どうしたらいいのでしょうか?? C言語だったら、配列を宣言して、その配列にファイル名を格納、という 書き方をしようかと思うのですが、 perlでの書き方がさっぱりわかりません・・・。 変数(C言語では配列)を定義したりしなくてもいいのでしょうか? わかりにくい質問ですみませんがどうか宜しくお願いします!

    • ベストアンサー
    • Perl
  • 特殊なファイル名のファイルの削除方法

    間違えて "---------------------" という名前のファイルが作成されてしましました。これを削除するにはどうしたらよいのでしょうか? 以下のよう"---"がにオプションと解釈されてしまい、ファイル名として認識されなく困っています。 % >rm ------------------ rm: unrecognized option `---------------------' Try `rm --help' for more information. 宜しくお願い致します。

  • シェルファイル内での「setenv」、「unsetenv」の実行

    (UNIX環境) シェルファイル内にて 「setenv LANG ja_JP.SJIS」 「unsetenv LANG」 と記述し実行しようとしたのですが、 「setenv:not found」 「unsetenv:not found」 というエラーが出力されてしまいます・・・。 ちなみにコマンドをそのまま実行した場合は正常に処理されます。 kshにて実行されている為で、cshで実行しなければならないということでしょうか? 現在デフォルトにて何シェルが起動しているのか、どのようしたら分かるのでしょうか? 「env | grep csh」 と実行してみると「SHELL=/user/bin/csh」という結果がえられるのですが・・・。

  • ファイルダウンロードで、DBCSファイル名が文字化け

    Perlで、ヘッダーを付けてファイルをダウンロードするスクリプトを作っています。 以下のように、test.html(EUC)からattach.cgi(Shift-JIS)へ飛びますが、IEとFirefoxで動作が違います。 ・IE: ファイル名が化けない ・Firefix : ファイル名が化ける おそらく、Firefoxの場合、呼び出し元がEUCなので、その先のattach.cgiもEUCだと決め付けているのでしょう。 試しに、attach.cgiをEUCにした場合、動作が逆になります。 ・IE: ファイル名が化ける ・Firefix : ファイル名が化けない ブラウザに対して、「ファイル名はShit-JISです」と宣言できるような文があればと思って調べているのですが、見つかりません。 ファイル名が化けないようにする方法がありましたらご教授いただけますと助かります。 ■==== test.html (EUC) ======= <HTML> <HEAD><meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"></HEAD> <BODY> <a href="attach.cgi">添付ファイルのテスト</a> </BODY> </HTML> ■==== attach.cgi (Shift-JIS) ======= $filename="日本語のテストです.txt"; print "Content-type: application\n"; print "Content-Disposition: attachment; filename=$filename\n\n"; ■テストした環境 IE 6.0 Firefox 2.0.0.8 WindowsXP(sp2) Perl 5.8.8 よろしくお願いします。

    • ベストアンサー
    • CGI
  • ロケールをutf8からsjisにするとログイン時に「イベントがありません」エラー

    こんにちは。私はLinux CentOS5を使っています。 あるユーザ(aaaとする)でログインシェルを/bin/cshにしています。 システムロケールをUTF8からSJISに変更すると(i18nファイルを変更しました)、 [aaa@centos ~]$ su - aaa パスワード: ~: イベントが見つかりません. となってcshスクリプトなどが使えず、/home/aaa/.cshrcも正常に読み込まれないようなので、/home/aaa/.cshrcで書いているPATHなどが通っていません。 わからないのは、システムロケールがUTF8の時は問題なくログインして.cshrcもちゃんと読めていたのに、SJISにするとエラーが起こることです。 どうかよろしくお願いします。

  • Linuxのホスト名をランダムに変更したい

    Linuxのホスト名をランダムに変更したい どのようにすればランダムにホスト名を変更できますか? シェルやフリーソフトを教えて下さい。