ファイル名に特殊文字を含むファイルを削除/移動できません


17

以下に示すように、ファイルには一般的でない文字が含まれています。

ファイルマネージャのスクリーンショット

端末またはDolphinでそれらを削除すると、エラーが返されます。

そのようなファイル、又はディレクトリはありません

ls -laディレクトリで実行すると、次の出力が得られました。

-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

fsck別のOSからパーティションでコマンドを実行しましたが、何も変わりませんでした。

これらのファイルを削除するにはどうすればよいですか?


1
暗号化されたホームディレクトリを持つようにシステムを設定しましたか?
ドビー

@dobeyしませんでした。
karjedavpalaa

5
@パンサーあなたは間違っています。これはない、それがあっても、それ自体で、破損したファイルシステムの表示は、とされたいくつかの種類のデータの破損に起因し、fsckはそれについて何もしません。
zwol


1
名前に認識されない文字が含まれるファイルがありました。ファイルの名前を変更しました。その後、それらを削除できます。
ravery

回答:


35

簡単な方法は、これらのファイルをiノードで削除することです。:)

ls -liディレクトリ内で一般的でない文字を使用して、各ファイルのiノード番号を表示します。たとえば、

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

次に、次の例のように、findユーティリティを使用して、構文を使用して、名前で対応するファイルを削除しますfind <somepath> -inum <inode_number> -exec rm -i {} \;

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

-iオプションは、rm私はちょうどあなたが削除するという意味ではありませんでした誤って削除したファイルからあなたを保つためにこれを追加し、本当に必要はありません。:) rm削除する各ファイルの確認を求めます。

iノードで複数のファイルを削除する場合は、次の-o(意味または)構文を使用できますfind

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

括弧内の式をより多くの-o -inum <inode_number>式で拡張することにより、より多くのiノード番号を追加できます。


4
どうrm -ri .
ブレントバカラ

これは機能しました:find <somepath> -inum <inode_number> -exec rm -i {} \; コマンドで「-inum」、「{}」、「\」は何をしますか?
karjedavpalaa

複数のファイルを一度に削除するにはどうすればよいですか?また、ありがとう、あなたは私の一日を作った!
karjedavpalaa

2
ただし、@ BrentBaccala rm -ri .はiノードによってファイルを削除しません。作業ディレクトリ全体を単純に再帰し、各ファイルを削除するかどうかを尋ねます。不要なファイルを誤って削除しないように、どのファイルを要求しているかに非常に注意する必要があります。確かに、このコマンドをホームディレクトリに使用したくありません-ファイルがたくさん含まれています。;)
Malte Skoruppa

3
@karjedavpalaa(1)-inumfind、iノード番号でファイルを検索するように指示します。(2)で{}見つかったファイルと一致しますgrep。(3)\は、;-execオプションに渡されたコマンドを終了する記号をエスケープしますfind。(4)複数のファイルを一度に削除する方法を説明するために回答を編集しました。
マルテスコルッパ

13

これは、「ファイルシステムの破損」のようなものではないことを理解することが重要fsckです。ファイルシステムに関する限り、値0x00(ASCII NUL、C文字列終了マーカー)または0x2F(、ディレクトリセパレーター)を持つ単一バイトがない限り、ファイル名は任意のバイトシーケンスにできます/。(ファイル名に何らかのfsck理由で00または2Fバイトが埋め込まれている場合は、修正する必要があります。)

むしろ、アプリケーションソフトウェア(Dolphin、ls)が「ロケール」に表示できない文字を含むと考えるファイル名であるため、プレースホルダー文字に置き換えています。これらの文字も入力できないため、ファイルの操作は難しくなりますが、名前を入力したりコピーして貼り付けたりすることなく、できる限り実行できます。たとえば、問題のファイルをDolphin内から直接削除または名前を変更した場合、うまくいくはずです(うまくいかない場合、それはDolphinのバグです)。

シェルからそれらについて何かを行う必要がある場合(たとえば、それらがrootGUIプログラムによって所有されているため、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)


--version不明なオプションの名前を変更:バージョン
エルダーオタク

@ElderGeek file $(which rename)印刷とは何ですか?(file最初にパッケージがインストールされていることを確認してください。)
zwol

/usr/bin/rename: symbolic link to /etc/alternatives/renamefile実際にあなたが得るためにシンボリックリンクを追いかけるために必要があり、デフォルトでインストールされている)/usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable が、man rename速く表示...である
エルダーオタク

@ElderGeek perlスクリプトの場合、おそらく「Perlを起源とするもの」の古いバージョンであり、サポートしていません--version。私が提案したコマンドはまだ動作するはずです。(Debian不安定--version版を実行するコンピューター上の/usr/share/doc/rename/changelog.gzは、2013年にPerlの名前変更のバージョン0.10で追加されたことを示しています。しかし、このプログラムは実際には2007(!)以降機能を変更していないため、問題ありません。)
zwol

あ!それが混乱を説明しています。多くの反対の主張にもかかわらず、DebianはUbuntuではありません。すべてのリリースについて話すことはできませんが、現在サポートされているUbuntu LTS(14.04)の一部のバージョンにはまだありません。(16.04はそうですが)
オタク長老
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.