破損したtarファイルを解凍して削除できないディレクトリをいくつか入手しました。削除しようとすると見つからないようですが、ls
bashとPythonの両方で同様の動作が発生します。ただしrm -rf
、を使用して削除しようとしましたが、見つからないと文句を言った後、リストに表示されls
ました(下記参照rm -rf
)。コマンドfind
を実行するとファイルが存在すると表示されますが、それでも削除方法がわかりません。
私の試みは次のとおりです。
ここで両方を確認し、ディレクトリがあることに同意することができls
ますfind
。
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
しかし、削除することはできません。
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt
できますがcd
空です。
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
以下をご覧ください。これは単純なファイルではなくディレクトリですが、ファイルls
が見つからないというメッセージが表示され、リストだけがリストされていると奇妙に動作します。rm -rf
rl]$ rm mikeaâ^Á^Äcnt/
rm: cannot remove `mikeaâ\302\201\302\204cnt/': Is a directory
rl]$ rm -rf mikeaâ^Á^Äcnt/
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
以下はPythonを使った試みです。ファイルが見つかりましたが、名前を削除可能な名前として使用することはできません。
rl]$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import shutil
>>> os.listdir('.')
['mikea\xc3\xa2\xc2\x81\xc2\x84cnt']
>>> shutil.rmtree(os.listdir('.')[0] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/shutil.py", line 204, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib64/python2.6/shutil.py", line 202, in rmtree
names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'
タブ補完機能を使用しても、選択した名前は機能しません。
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Pythonを使用してbashに名前を表示すると、次のような結果が得られます。
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
破損したディレクトリを削除するために私ができることはありますか?デフォルトのファイルシステム(NFS)は正常に動作しているようで、他の問題は報告されていません。破損したtarファイルのため、以前はそのような問題は発生しませんでした。
編集:ここではfind
私自身の-exec
オプションを使って電話をかけます。rm
rl]$ find -maxdepth 1 -type d -empty -exec rm -f {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
しかし、ファイルはまだそこにあります。 (ls
見つからないと文句を言うが、とにかく表示されます)
2番目の編集:
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
動作は同じままで、ファイルはまだ存在します。
3番目の編集:
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
mikeaâcnt
Pythonの試みの出力 mikea\xc3\xa2\xc2\x81\xc2\x84cnt
とこのスクリーンショットを見るよりも名前が重要です。
4番目の編集:ワイルドカードを使用した試みは次のとおりです。
rl]$ echo *
mikeaâcnt
rl]$ echo mike*
mikeaâcnt
rl]$ rm -rf mike*
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
私のロケール:
rl]$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
5番目の編集:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
そして動作が変わり、次のことをls
行います。cd
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt
mikeaâcnt: No such file or directory.
削除しようとした後にこれが発生しました。答えの1つが提案したように、NFSの問題かもしれません。ここvinc17が提供しました。
lsof
第6編集: これはおよびls -a
rl]$ /usr/sbin/lsof mikeaâ^Á^äcnt lsof: mikeaâ\xc2\x81\xc2\x84cnt の状態エラー: ファイルまたはディレクトリが存在しません。
上記は間違っています。正しいlsof
呼び出しは次のとおりです。 (rl は親ディレクトリです。)
rl]$ /usr/sbin/lsof | grep mike | grep rl
tcsh 11926 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14733 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14734 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
grep 14735 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
lsof 14736 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl
rl]$
rl]$ ls -a
ls: cannot access mikeaâcnt: No such file or directory
. .. mikeaâ??cnt
7番目の編集:移動は機能しません。 (以前に試しましたが、出力を保存していませんでした。)ファイルにも同じls
問題がありますrm
。
8番目の編集:提案されているように16進文字を使用してください。
rl]$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a mikea......cnt.
rl]$ rmdir $'mikea\6d69\6b65\61c3\a2c2\81c2\8463\6e74\0acnt'
rmdir: failed to remove `mikea\006d69\006b651c3\a2c2\\81c2\\8463\006e74': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$
9番目の編集:stat
コマンドの場合:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
すべての出力で判断すると、コメントで提案されているように、バグやその他のNFSの誤動作がある可能性が高くなります。
編集10:strace出力のポイントは次のとおりです。出力が大きすぎるため、出力または次の2つのコマンドです。
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
編集11:だから、私は上記の以前はディレクトリに入るrmdir
ことができることを知っていましたが、それ以降は昨日のようにもう入ることができませんでした。ファイルが存在します。cd
rmdir
cd
.
..
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
最終編集:ローカル管理者がこの問題を処理し、サーバー自体にログインして削除する方法で処理するのを見ました。彼らの説明は、名前に不適切な文字セットが問題である可能性があることでした。
答え1
このようなファイル/ディレクトリを削除する1つの方法は、inode参照を使用することです。
現在のディレクトリにある要素のインデックスノードを見つけるには、次の手順を実行します。
ls -i
14813568 mikeaâcnt
このコンテンツを削除するには:
find . -inum 14813568 -delete
答え2
次の内容はからインポートしたものです。この記事ディレクトリの削除を拒否する理由を説明できます。
NFSv4では、UTF-8を使用してネットワーク経由ですべてのファイル名を交換する必要があります。 NFSv4仕様RFC 3530は、セクション1.4.3でファイル名をUTF-8でエンコードする必要があると述べています。 「多少のバリエーションがありますが、ファイル名とディレクトリ名は国際化の基本を処理するためにUTF-8でエンコードされています」 NFS 4.1 RFC(RFC 5661)のセクション1.7.3にもあります。現在のLinux NFSクライアントは、現在のロケールとUTF-8の間の変換なしでファイル名を直接渡します。リモートNFSv4システムを使用するシステムでは、UTF-8以外のファイル名を使用することが実際の問題になる可能性があります。 NFS仕様に準拠するすべてのNFSサーバーは、UTF-8以外のファイル名を拒否する必要があります。したがって、ファイルが実際にLinuxクライアントからNFSサーバーとして保存できることを確認するには、現在UTF-8ファイル名を使用する必要があります。つまり、一部の人はLinuxがファイル名に特定の文字エンコーディングを使用することを強制しないと考えていますが、実際にはファイル名にUTF-8エンコーディングを使用する必要がある場合があります。
UTF-8は長期的なアプローチです。システムは、UTF-8に切り替えることができる時間を提供するために、UTF-8だけでなく多くの古いエンコーディングもサポートする必要があります。 UTF-8を「どこでも」使用するには、UTF-8をサポートするためにすべてのツールを更新する必要があります。数年前はこれが大きな問題でしたが、2011年現在はほとんど解決された問題であり、少数の後続システムへの軌道はかなり明らかだと思います。
すべてのバイトシーケンスが正当なUTF-8ではなく、それを表示する方法を理解する必要はありません。カーネルがこれらの制限を適用してUTF-8ファイル名のみを許可する場合、問題はありません。すべてのファイル名は正当なUTF-8になります。 Markus Kuhnのutf8_check C関数は、シーケンスが有効なUTF-8であるかどうかをすばやく確認できます。
ファイルシステムは特定の規格に準拠したファイル名を要求する必要があります。これは、人を制御するためのいくつかの邪悪な必要性のためではなく、後で名前が正しく表示されるようにするためです。標準が不足している場合、ユーザーは仕事をより簡単にすることができます。しかし、ファイルシステムではファイル名をUTF-8に強制しないため、ゴミが現れやすくなります。
答え3
ご覧のとおり、何らかの理由でファイル名と一致する必要はないため、コマンドラインにASCII以外の文字を使用しないでください(Unicodeにはアクセント文字を表すさまざまな方法があります)。それは次のとおりです。
rm -rf mike*
ファイル名はシェルから直接生成されるため、この方法は機能します。ただし、一致するものが1つしかないことを確認してください(echo mike*
最初に確認)。
まあ、うまくいけばcd
理由がないか、話す必要があるので、rm
問題はおそらくファイルシステムレベルにあるでしょう。ls
No such file or directory
ls
注:ディレクトリが空であるかどうかを見つけるために使用せず、代わりにを使用してくださいls -a
。
ディレクトリは他のプロセスで引き続き使用できます(プロセスのcwdの場合を含む)。 IMHO これがまだ「存在する」がエラーが発生する理由です。たとえば、ls
いくつかのlsof
情報を提供できますが、NFSはそれを使用するマシンを見つける必要があります。特に、NFSでは奇妙なエラーが発生する可能性があります。場合によっては、ファイル/ディレクトリが親ls -a
ディレクトリに表示されることがあります。.nfs*
あなたがそれを得るとき:
$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
ファイルがまだ存在しているようです。目次NFSキャッシュおよび/または他のプロセスで使用されるため、関連情報はありません。ls
ファイル自体に関する情報を取得しようとすると、ファイル自体が存在しないため(ディレクトリテーブルにのみ存在する)エラーが発生するため、エラーが表示されます。次に、ls
ファイル名をディレクトリテーブルのまま出力します。あるケースでは疑問符がありますが、別のケースでは疑問符がないという事実は、ls
ディスプレイバグIMHO(あなたの質問には関係ありません)によるものです。
答え4
私は同じ問題に直面したと思います。以前に呼び出されたファイルを見たことがあります☃
。ls
この場合、ファイルはとしてマークされますが、â??
を使用して削除できますrm ☃
。
これにより、間違った名前を正しい名前に変換するために、次のアプローチが使用されました。
まず、ファイル名のバイトを取得します。
$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a mikea......cnt.
その後、これらのバイトはUTF-8にデコードされ、Unicodeコードポイントを取得します。たとえば、このWebサイトの16進入力を使用します。http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder
U+006D LATIN SMALL LETTER M character
U+0069 LATIN SMALL LETTER I character
U+006B LATIN SMALL LETTER K character
U+0065 LATIN SMALL LETTER E character
U+0061 LATIN SMALL LETTER A character
U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX character (â)
U+0081 <control> character ()
U+0084 <control> character („)
U+0063 LATIN SMALL LETTER C character
U+006E LATIN SMALL LETTER N character
U+0074 LATIN SMALL LETTER T character
これはバイト境界の下にあります。私達は次のバイトを得ます:
6D 69 6B 65 61 E2 81 84 63 6E 74
このシーケンスをUTF-8で処理すると、次のような結果が得られます。
U+006D LATIN SMALL LETTER M character
U+0069 LATIN SMALL LETTER I character
U+006B LATIN SMALL LETTER K character
U+0065 LATIN SMALL LETTER E character
U+0061 LATIN SMALL LETTER A character
U+2044 FRACTION SLASH character (⁄)
U+0063 LATIN SMALL LETTER C character
U+006E LATIN SMALL LETTER N character
U+0074 LATIN SMALL LETTER T character
したがって、ファイル名は次のようになります。mikea⁄cnt
通常のスラッシュの代わりに分数スラッシュが使用されます。これでこの名前をに渡すことができますrmdir
。