作曲・浄書・指導・音響

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

文字化けファイルの操作

inode番号やパス名展開を利用して、Linuxの端末上で文字化けしたファイルを操作する。inode番号を利用した方が事故率は下がる。というよりも、パス名展開は事故率は高いと思う。また、後述するように、ヒストリ置換を利用したり、rmに-iオプションをつけるなど、確認してから実行することを推奨する。

inode番号を利用する

Linuxでは、すべてのファイルにinode番号(inum)が割り当てられている。そのinode番号を利用することで、対象ファイルを操作する。inode番号はlsに-iをつけるとファイル名の前に確認できる。なお、ls -Fでファイルタイプが表示される。ファイル名の最後に/がついているものがディレクトリである。

$ ls -iF
159450  繝上Ο繝シ.c  156335 '荳?譎ゅヵ繧。繧、繝ォ'/   154490  險ュ螳�.txt

文字化けしたファイル名の前につけられた数字がinode番号だ。inodo番号を指定して操作を行うには、検索コマンドであるfindにinode番号(-inum)を付けたものをコマンド置換で用いる(findのオプションの「.」は開始位置、「-maxdepth 1」は検索の範囲でその階層のみが対象となる)。コマンド置換とは、コマンドを「``」か「$()」で括ることでその結果を返すというものだ(「$()」はネスト可能)。次に提示するものはその操作例である。

$ ls -iF
159450 繝上Ο繝シ.c  156335 '荳?譎ゅヵ繧。繧、繝ォ'/  154490 險ュ螳�.txt
$ rm `find . -maxdepth 1 -inum 159450`
$ mv $(find . -maxdepth 1 -inum 154490) config.txt
$ ls -i
154490 config.txt  156335 '荳?譎ゅヵ繧。繧、繝ォ'/
$ cd $(find . -inum 156335)
/荳?譎ゅヵ繧。繧、繝ォ$

「繝上Ο繝シ.c」が削除され、「險ュ螳�.txt」がリネームされたことがわかる。また、文字化けしたディレクトリ「'荳?譎ゅヵ繧。繧、繝ォ'」に移動できることも確認できる。

[目次へ]

パス名展開を利用する

パス名展を利用して削除する。パス名展開には、任意の一文字を表す「?」、任意の文字列を表す「*」、括られた文字のいずれかにマッチする「[]」、括られた文字以外の文字のいずれかにマッチする「[^]([!])」がある。手軽な反面、パス名展開は先述したように事故る可能性が高いので、inode番号を利用する方が良い。なお、パス名展開は正規表現に似ているが、全く別のものである。

$ ls -F
繝上Ο繝シ.c  繝。繧、繝ウ.c  '荳?譎ゅヵ繧。繧、繝ォ'/   險ュ螳�.txt

パス名展開を使うと、拡張子が確認できるものは「*」で簡単に操作できる。しかし、同じ拡張子のファイルが複数ある場合に「*」を使うと、マッチする全てのファイルが処理の対象となるので注意が必要だ。その場合は「?」や「[]」を適宜組み合わせて使用する。なお、「[]」は[A-Za-z0-9]とまとめて指定することもできる。また、あるいは(or)、を指定するブレース展開「{}」を利用することも可能だ。

$ ls -F
 繝上Ο繝シ.c  '荳?譎ゅヵ繧。繧、繝ォ'/   險ュ螳�.txt
$ mv *.txt config.txt
$ rm ??????.c
$ mv ?????.c hello.c
$ mv [^a-z]* tempfiles
$ ls -F
config.txt  hello.c  tempfiles/
$ mv *.{txt,c} tempfiles
$ ls tempfiles
config.txt  hello.c

単純な状態であればパス名展開を利用すると早いが、複雑な状態であればinode番号を利用した方が事故率はぐっと下がるだろう。

[目次へ]

処理を確認して実行する

inode番号を利用した処理では、番号の見間違いや打ち間違いといった問題が起こりやすい。そこで実行する前に処理を確認するのが良いだろう。確認の方法は二種類に大別できる。一つはfindのみを実行し、結果に問題なければヒストリ置換で処理する方法だ。他方はコマンドに用意された確認オプションを使う方法がある。おすすめするのは前者だ。

ヒストリ置換を利用する

ヒストリ置換とは、historyに格納されている過去に実行されたコマンドの履歴を参照する機能である。今回用いる「!!」は直前に実行されたコマンドを参照するものだ。

$ ls -i
159450 繝上Ο繝シ.c  154490 險ュ螳�.txt
$ find . -maxdepth 1 -inum 159450 
./繝上Ο繝シ.c
$ rm `!!`
$ find . -maxdepth 1 -inum 154490
險ュ螳�.txt
$ mv $(!!) config.txt
$ ls
config.txt

findのみを行うことで、指定したinode番号が対象のファイルか否かが確認できる。対象に問題がなければ、rmの引数にコマンド置換で「!!」を指定する。実行後、Ctrl + pや上矢印で履歴を確認すると、「rm `find . -maxdepth 1 -inum 159450」となっていることが分かる。

オプションを利用する

rmに-iオプションをつけると、実行するかY/nで確認してくる。yを入力する実行される。

$ ls -i
159450 繝上Ο繝シ.c  154490 config.txt
$ rm -i $(find . -maxdepth 1 -inum 159450)
rm: remove regular empty file './繝上Ο繝シ.c'? y
$ ls
config.txt

簡単な処理であれば、この方法でも問題ないかもしれまない。しかし、rm以外のコマンドごとに確認するオプションを覚える必要があるし、そもそも確認するオプションが用意されていないコマンドもあるだろう。したがって、前者のヒストリ置換を利用した確認方法を強く推奨する。

[目次へ]