ファイル名が文字化けしたものを削除する場合、findでinodeサーチしたものを削除する方法がよく紹介されていますが、他に方法は無いかと思い調べてみました。
環境
- ロケールは
ja_JP.UTF-8
$ cat /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
準備
- 文字化けさせるファイルを生成
$ touch ほげ ほげほげ ほげほげほげ
$ ll
合計 0
-rw-r--r-- 1 root root 0 3月 12 10:52 2018 ほげ
-rw-r--r-- 1 root root 0 3月 12 10:52 2018 ほげほげ
-rw-r--r-- 1 root root 0 3月 12 10:52 2018 ほげほげほげ
- convmvコマンド(ファイル名の文字コード変換)をインストール
$ yum intall convmv
検証
- まずは準備したファイルの文字コードを変換
$ convmv -r -f utf8 -t sjis ほげほげ --notest
mv "./ほげほげ" "./?ق??ق?"
Ready!
$ ll
合計 0
-rw-r--r-- 1 root root 0 3月 12 10:52 2018 ?ق??ق?
-rw-r--r-- 1 root root 0 3月 12 10:52 2018 ほげ
-rw-r--r-- 1 root root 0 3月 12 10:52 2018 ほげほげほげ
utf8からsjisに変換したところ、綺麗に文字化けしました。
ここでlsで出力されるファイルの上から2番目(ほげほげ)を変換しましたが、変換後の出力では上から1番目に出力されていました。
もしかして文字化けしたファイル名のファイルは、lsすると一番上に表示される?と思い、実ファイルの存在するディレクトリでも試してみました。
$ touch /var/log/きーた
$ ll /var/log/
合計 66744
drwxr-xr-x. 2 root root 4096 11月 11 07:09 2010 ConsoleKit
(中略)
-rw-r--r-- 1 root root 0 3月 12 10:56 2018 きーた
$ convmv -r -f utf8 -t sjis /var/log/きーた --notest
mv "/var/log/きーた" "/var/log/???[??"
Ready!
$ ll /var/log/ | head -2
-rw-r--r-- 1 root root 0 3月 12 11:22 2018 ???[??
drwxr-xr-x. 2 root root 4096 11月 11 07:09 2010 ConsoleKit
おお、一番上になってる。
- なら複数ファイルが文字化けしていたら?
$ touch ほげ ほげほげ ほげほげほげ ふー ふーふー ふーふーふー
$ ll
合計 0
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふーふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげ
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげほげ
$ convmv -r -f utf8 -t sjis ほげ --notest
mv "./ほげ" "./?ق?"
Ready!
$ convmv -r -f utf8 -t sjis ふーふー --notest
mv "./ふーふー" "./?Ӂ[?Ӂ["
Ready!
$ ll
合計 0
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ?ق?
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ?Ӂ[?Ӂ[
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげほげ
文字化けファイルが上から順に2ファイル並んでる!
そうであれば…
実践
検証結果を踏まえ、ls出力から文字化けしたファイル数分だけ抜き出してrmに引き渡せば消せる?
$ ll
合計 0
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ?ق?
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ?Ӂ[?Ӂ[
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげほげ
$ ls | head -2 | xargs rm
$ ll
合計 0
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0 3月 12 11:03 2018 ほげほげほげ
消えた!
以上、Qiita初投稿は小ネタとなりました。