Linux
CentOS

文字化けファイルをinode指定せずファイル名で削除

ファイル名が文字化けしたものを削除する場合、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初投稿は小ネタとなりました。