UNIX/基礎知識/エスケープキャラクタ
Table of Contents |
エスケープキャラクタとは特殊な意味を持った文字、ワイルドカードの機能をキャンセルし、一般文字として扱うための文字のことです。正規表現の際にも使えます。 UNIX ではバックスラッシュ ( \ ) がこれに当ります。
例えば
% ls *.html
とすると、ファイル末尾の名前が .html であるファイルをすべてリストしますが、
% ls \*.html
のようにすることによって、*.html という名前のファイルそのものを指します。 また、
% ls "*.html"
や
% ls '*.html'
のようにしても可能です。\ よりも " ではさむほうが便利だと思います。
おかしな名前のファイルの消去 
ファイル名に空白が入っていたり - ではじまっていたり、() が使われていたり その他怪しい文字が使われている場合は、
% rm "(null).txt" % rm "a b" % rm "-e"
などのようにして消去することができます。
日本語名ファイルの消去 
ファイル名に日本語が入っているなどして端末上で指定できない場合は、
% ls -i
を実行し、i-node 番号を調べ、
% find . -inum [i-node_No] | xargs rm
のようにして find コマンドの力を借りて i-node 番号を指定して削除します。 find コマンドについて詳しくは find の方を参照してください。
わかりづらい方には、
% rm -i *
を実行して消したいものがでてきたら、y を入力するという微妙な技もあります。
絶対やらないと思いますが、他にはファイル ( test.sh とします )を作成して
rm "日本語"
のようにコマンドを記述しておき、
% sh test.sh
のようにしてシェルスクリプトとして実行するという方法もあります。 日本語名ファイルの「ファイル名の文字コード」とこのファイル( test.sh )の 「内容の文字コード」が一致していなければいけません。test.sh に
touch "日本語"
のように記述して先ほどのように実行すれば日本語名ファイルを 作成することができますので、いざという時のためにいろいろ試しておくといいと思います。
正規表現を使用できるコマンド 
% grep [filename] ".*\.txt"
のように " ではさんで、シェルにワイルドカードとして展開されないように 使用したりします。その正規表現の中でも
\.
とエスケープキャラクタを使用しています。正規表現では . (dot) は "任意の1文字" という意味があるのでただの . (dot) 自身を示すために \. としたわけです。 ややこしいですね。 自分でシェルスクリプトを書くとさらにややこしいことによくなります。
" と ' の違い 
どちらでもエスケープすることはできますが、厳密にいうと、" ではシェル変数を展開しますが、' では展開しません。 例えば
% echo "$USER*"
とすると、$USER 変数(ユーザー名が格納されています)が展開されて、* はエスケープされてただの * になります。例えば自分の場合は
s1080134*
のようになります。
% echo '$USER*'
とすると、
$USER*
のようにシェル変数が展開されずただの文字として出力されます。 このへんは シェルでも perl などでも共通なので覚えておくとよいでしょう。