【linux】文字化けしているファイル名のファイルを探す、削除する
問題
lsで確認すると文字化けしたり????になっているファイル名のファイルをどうやって探したらよいですか?
探した後、削除したい場合はどうしたらよいですか?
FTP、samba、プログラムなどで作成されたファイルで、おかしな名前になっているものがありました。
答え
探す
例えば、「”英数記号のみ”以外」といった条件で拾えそうならば、以下のようにできる。
$ ls -1 /aaa/bbb/ccc | grep -v -E \^\[a-zA-Z0-9\._\-\]\+\$
正規表現は、「行頭から行末まで、a-zA-Z0-9,ドット、ハイフン、アンダースコアの文字でできているファイル名」。grep -v でそれを満たさないものを拾う。
!#?+%[]{}などの記号も含んでいてもよい場合や、日本語の文字化けファイル名を探したい場合は、以下でもよいかもしれない。
$ ls -1 /aaa/bbb/ccc | grep -v -E \^\[!-~\]\+\$
確認するまでであればlsでよいが、この後さらに移動などの操作をする場合は find で拾うとよい。
$ find /aaa/bbb/ccc | grep -v -E \^\[!-~\]\+\$
ファイルに出すことも可能
$ find /aaa/bbb/ccc | grep -v -E \^\[!-~\]\+\$ > mojibake-list.txt
削除、移動などする
一覧を xargsに渡してみる。
文字化けしたファイル名が入っていると以下のようなエラーになることがあるので、
xargs: unmatched シングル quote; by default quotes are special to xargs unless you use the -0 option
findで出した改行区切りの一覧を、trでヌル文字区切りにしてからxargsに渡すと、mvやrmができた。
$ find /aaa/bbb/ccc | grep -v -E \^\[!-~\]\+\$ | tr '\n' '\0' | xargs -0 -I {} mv {} /xxx/yyy/zzz
コメント