これは、「ファイルシステムの破損」のようなものではないことを理解することが重要fsck
です。ファイルシステムに関する限り、値0x00(ASCII NUL、C文字列終了マーカー)または0x2F(、ディレクトリセパレーター)を持つ単一バイトがない限り、ファイル名は任意のバイトシーケンスにできます/
。(ファイル名に何らかのfsck
理由で00または2Fバイトが埋め込まれている場合は、修正する必要があります。)
むしろ、アプリケーションソフトウェア(Dolphin、ls
)が「ロケール」に表示できない文字を含むと考えるファイル名であるため、プレースホルダー文字に置き換えています。これらの文字も入力できないため、ファイルの操作は難しくなりますが、名前を入力したりコピーして貼り付けたりすることなく、できる限り実行できます。たとえば、問題のファイルをDolphin内から直接削除または名前を変更した場合、うまくいくはずです(うまくいかない場合、それはDolphinのバグです)。
シェルからそれらについて何かを行う必要がある場合(たとえば、それらがroot
GUIプログラムによって所有されているため、GUIプログラムで変更できない場合)、「glob」パターンを使用して間接的に名前を付けることができます。 (s)バイトと一緒に渡されます。
もちろん、グロブパターンの一致が多すぎるため、偶発的なものを削除したくないので、Perl rename
ユーティリティを使用して各ファイル名を16進エンコーディングに変換することをお勧めします。
$ rename '$_ = unpack("H*", $_)' *
これは情報を破壊しません-ファイル自体も、破壊される前にファイル名に元々エンコードされていた意味もありません。たとえば、特定のファイルに対して元に戻すことができます。
$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63
注意:というrename
異なる名前の2つのプログラムがあります。上記のコマンドは、Perlで作成されたコマンドでのみ機能します。Ubuntuでは、必要なのは「util-linux」パッケージからではなく、「rename」パッケージからのものです。 rename -h
区別します:これはあなたが望むものです...
$ rename -h
Usage:
rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
[ files ]
# ...
...これはあなたが望むものではありません...
$ rename -h
Usage:
rename [options] <expression> <replacement> <file>...
# ...
探すべき重要なことは「perlexpr」です。上記のすべてのオプションを理解していない古いバージョンのPerlの名前変更があるかもしれませんが、私が示したコマンドはまだ機能するはずです。
編集:14.04 .5では、含まれているperlスクリプトrename
は-hスイッチをサポートしていません。正しいものを持っていることを確認するには、manページをチェックしますman rename
。この場合、一番上の行には以下が含まれます。
RENAME(1)PerlプログラマリファレンスガイドRENAME(1)