web-dev-qa-db-ja.com

破損したファイル名のファイルを削除するにはどうすればよいですか?

どういうわけか、プログラムは壊れたファイル名でファイルを作成しましたが、もう削除できません。ファイルを削除しようとすると、ファイルが存在しないかのように「そのようなファイルまたはディレクトリはありません」という結果になります。

問題は、ファイル名の制御文字ASCII 2のようです。

$ ls
??[????ة?X

$ ls | xxd
00000000: 3f3f 5b3f 3f02 3f3f d8a9 3f58 0a         ??[??.??..?X.

# Typing '?' and letting the bash complete the filename
$ rm \?\?\[\?\?^B\?\?ة\?X 
rm: das Entfernen von '??[??'$'\002''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden

$ rm *
rm: das Entfernen von '??[??'$'\002''??ة?X' ist nicht möglich: Datei oder Verzeichnis nicht gefunden

$ ls -i
2532 ??[?????ة?X
$ find -inum 2532 -delete
find: ‘./??[??\002??ة?X’ kann nicht gelöscht werden.: Datei oder Verzeichnis nicht gefunden

再起動後にfsckを実行しようとしましたが、ファイルはまだ残っています。

$ zcat /var/log/upstart/mountall.log.1.gz
...
fsck von util-linux 2.25.1
/dev/sdc3: sauber, 544937/6815744 Dateien, 21618552/27242752 Blöcke
...

問題があったことを示すものはありません。 ( "ザウバー" =きれい)

失敗した自分の削除プログラムとrmコマンドを書いてみました。

$ cat fix.c
#include <stdio.h>
#include <errno.h>

int main() {
    char filename[20];
    sprintf(filename, "%c%c%c%c%c%c%c%c%c%c%c%c", 0x3f,0x3f,0x5b,0x3f,0x3f,0x02,0x3f,0x3f,0xd8,0xa9,0x3f,0x58);
    printf("filename = %s\n", filename);

    int result = remove(filename);
    printf("result = %d\n", result);
    printf("errno = %d\n", errno);
    perror("Error");
    return 0;
}

$ gcc -o fix fix.c && ./fix
filename = ??[????ة?X
result = -1
errno = 2
Error: No such file or directory

私は同様の質問を見つけましたが、そこの答えは私にとってはうまくいきません:

その他の情報:

$ mount | grep " / "
/dev/sdc3 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

$ uname -a
Linux hera 4.13.0-16-generic #19-Ubuntu SMP Wed Oct 11 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 17.10 \n \l

このファイルを取り除く方法はありますか?

6
theHacker

ファイルがどのパーティションにあるか常に確認してください;-)

不良ファイルがルートパーティションではなくcifsマウント上にあることがわかりました。ファイルを取り除くための解決策は there のようでした:

対象のマシン上のファイルを削除します。 rmコマンドは正常に動作します。

2
theHacker

非ASCIIファイル名のファイルを削除するためのオプションがたくさんあります。

ANSI C quoting を使用して、議論中のファイル名のファイルを作成および削除することができました。

# Create the offending file
touch $'\x3f\x3f\x5b\x3f\x3f\x02\x3f\x3f\xd8\xa9\x3f\x58\x0a'

# Verify that the file was created
ls -lib

# Remove the offending file
rm $'\x3f\x3f\x5b\x3f\x3f\x02\x3f\x3f\xd8\xa9\x3f\x58\x0a'

この投稿を見てください:

次のコマンドは、現在のディレクトリ内で名前に非ASCII文字が含まれているすべてのファイルを削除する、その投稿からのコマンドです。

LC_ALL=C find . -maxdepth 0 -name '*[! -~]*' -delete

一致を絞り込むために、globパターンを変更するか、正規表現を使用できます。

ここに別の関連する投稿があります:

Iノードで削除することをお勧めします。ファーストラン ls -libを実行して問題のファイルのiノードを見つけ、次のコマンドを実行して削除します。

find . -maxdepth 1 -inum ${INODE_NUM} -delete

また、次の記事が一般的に役立つ場合もあります。

4
igal