文字化けファイルの操作
Linuxの端末上でファイル名が文字化けしてしまうことがあります。そんな時は、inode番号やパス名展開を利用して、文字化けしたファイルを操作します。前者のinode番号を利用した方が事故率は下がると思います。というよりも、パス名展開は事故率は高くなるような気がします。また、後述するように、ヒストリ置換を利用したり、削除する時もrm
に-i
オプションをつけるなど、確認してから実行することを推奨します。
inode番号を利用する
Linuxでは、すべてのファイルにinodeと呼ばれるユニークな番号(inum)が割り当てられています。このinode番号を利用することで、文字化けしたファイルを確実に操作することができます。
inode番号は、ls
コマンドに-i
オプションをつけることでファイル名の前に表示されます。また、-F
オプションででファイルタイプが表示されます。ファイル名の末尾に/
がついているものがディレクトリになります。
$ ls -iF
159450 繝上Ο繝シ.c 156335 '荳?譎ゅヵ繧。繧、繝ォ'/ 154490 險ュ螳�.txt
文字化けしたファイル名の前にinode番号が表示されているのが分かります。しかし、残念ながらこのまま操作することはできません。そこで、find
コマンドコマンド置換して利用します。コマンド置換とは、実行したいコマンドを$()
で括ることでその結果を返すものです。
具体的には、mv
やrm
などコマンドとfind
のコマンド置換を組み合わせます。find
でinode番号を指定するには-inum
オプションを付けます。また、-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
がconfig.txt
にリネームされました。また、文字化けしたディレクトリ'荳?譎ゅヵ繧。繧、繝ォ'
に移動することができました。
パス名展開を利用する
パス名展を利用して文字化けファイルを操作します。パス名展開には、任意の一文字を表す?
、任意の文字列を表す*
、括られた文字のいずれかにマッチする[]
、括られた文字以外の文字のいずれかにマッチする[^]
([!]
)があります。
$ 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
パス名展開を使うと、拡張子が確認できるものは*
で簡単に選択できます。しかし、同じ拡張子のファイルが複数ある場合には、?
や[]
を組み合わせて絞り込みます。なお、[]
は[A-Za-z0-9]
のように、まとめて指定したり、あるいは(or)を指定するブレース展開{}
を利用することもできます。
単純な状態であればパス名展開を利用すると手っ取り早いですが、複雑な状態であれば、やはり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
更新情報
- 作成日:2019-xx-xx
- 更新日:2022-04-29