この削除できないディレクトリを削除する方法は?


40

私は破損したtarファイルを解凍し、削除できないディレクトリで終わることができました。削除しようとすると、見つからないようですが、lsbashとpythonの両方で表示されます右以外は同様の挙動、私はそれを削除しようとした後rm -rflsそれは(後に以下を参照してくださいそれを示しています、それはそれを見つけることができません不平を言います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見つけられないと文句を言いますが、とにかくそれを表示します)

2nd EDIT:

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、このスクリーンショットよりも多くのものがあるようです:

ls出力

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

動作も変更されました。今lscd これを実行してください:

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.

これは、削除を試行した後に発生しました。vinc17の回答の1つで提案されているように、NFSの問題であると考えています。

第六EDIT:これは、の出力であるlsofls -a

rl] $ / usr / sbin / lsofmikeaâ^Á^Äcntlsof: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:これは非常に大きいため、出力またはこれらの2つのコマンドであるため、要旨のstrace出力です。

strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`

https://gist.github.com/mikeatm/e07fa600747a4285e460

編集11:上記の前に、 rmdircdはディレクトリに入ることができることに気づきましたが、昨日と同様に、再びrmdirできませんでしcdた。.そして.. ファイルが存在していました:

rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls  -a
.  ..
mikeaâ^Á^Äcnt]$ cd ../

最終編集:これについてローカル管理者を見ましたが、サーバー自体にログオンしてそこから削除することで対処しました。彼らからの説明は、名前の文字セットが不適切であることが問題になる可能性があるということです。


オプションfindを単に使用するのではなく、別のコマンドに出力をパイプする理由はありexecますか?
HalosGhost 14

理由はありませんでした@HalosGhost、あなたの質問に追加された情報の編集を参照してください
マイク-mの

2
UNIXとLinuxの経験がほとんどない人として、私の考えは次のとおりmvです。あとで削除できます。または、ディレクトリをより深いフォルダレベル(おそらくワイルドカードを使用)に移動してから、移動先のフォルダを削除してみてください。
Nzall 14

4
ディレクトリはクライアント上のメモリにのみ存在し、サーバー上では長い間失われていると思われます。マウントを解除して再度マウントしようとしましたか?クライアントを再起動してみましたか?他のクライアントに表示されますか?
カスペルド14

6
@ mike-mおそらくNFSサーバーで、NFSのバグに遭遇したようです。それまたはサーバー上のファイルシステムの破損。NFSサーバーの管理者が対処するのを待つ以外に、あなたが本当に他にできることはないと思います。
デロバート14

回答:


11

このエッセイからの次の抜粋は、そのディレクトリが削除を拒否する理由を潜在的に説明しています。

NFSv4では、すべてのファイル名をネットワーク経由でUTF-8を使用して交換する必要があります。NFSv4仕様、RFC 3530では、セクション1.4.3でファイル名をUTF-8でエンコードする必要があると述べています。新しいNFS 4.1 RFC(RFC 5661)セクション1.7.3にも記載されています。現在のLinux NFSクライアントは、現在のロケールからUTF-8への変換を行わずに、ファイル名をそのまま渡すだけです。UTF-8以外のファイル名を使用すると、リモートNFSv4システムを使用するシステムで実際の問題になる可能性があります。NFS仕様に従うNFSサーバーは、UTF-8以外のファイル名を拒否することになっています。したがって、ファイルを実際にLinuxクライアントからNFSサーバーに保存できるようにする場合は、現在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にしないため、簡単にゴミになる可能性があります。


これは、地元の管理者からの説明を反映しているようです。これを管理者の説明による回答としてマークします。私の最後の編集を参照してください
マイク-mの

19

このようなファイル/ディレクトリを削除する1つの方法は、iノード参照です。

現在のディレクトリ内の要素のiノードを見つけるには:

ls -i
14813568 mikeaâcnt

これを削除するには:

find . -inum 14813568 -delete

5番目の編集を参照してください。
マイクm 14

4
いいえ、これはiノードによってファイルを削除しません。これは、指定されたiノードのファイル名を探し、その名前でファイルを削除します。ここでは、正しい名前での試行がすでに行われているため、(間違った名前での他の試行と一緒に)助けにはなりません。
ジル 'SO-悪であるのをやめる' 14

@Gilles-技術的には、inode dentryを探してファイル名を返しますが、私は同意します。
mikeserv 14

1
@Nicolaiは私を助けてくれません。Directory not emptyメッセージが表示されます。
回折

1
うん、これについての面白い話:削除しようとしているファイルは?、そのiノード参照としてあります。それではどうやって削除しますか?
ニックハートリー

7

ご覧のように、何らかの理由で必ずしもASCIIファイル名と一致しない場合があるため、コマンドラインで非ASCII文字を使用しないでください(Unicodeにはアクセント付き文字を表すさまざまな方法があります)。何かのようなもの:

rm -rf mike*

ファイル名はシェルによって直接生成されるため、機能するはずです。ただし、一致するものが1つだけであることecho mike*を確認してください(最初に確認してください)。

まあ、うまくいけば、cdなぜ、rmまたはls言うべき理由はないNo such file or directoryので、問題はファイルシステムレベルにあるかもしれません。

注:lsディレクトリが空であるかどうかを確認するために使用しないでくださいls -a

ディレクトリは別のプロセスで使用されている場合があります(あるプロセスのcwdである場合を含む)。私見、それはまだそれが「存在する」理由ですが、エラーを生じる可能性がありlsます。lsof何らかの情報が得られる場合がありますが、NFSでは、どのマシンがそれを使用しているかを見つける必要があります。特にNFSでは、これにより奇妙なエラーが発生する可能性があります。ls -a親ディレクトリにある.nfs*ファイル/ ディレクトリが表示される場合があります。

あなたが取得するとき:

$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

NFSキャッシュのため、および/または別のプロセスで使用されているため、関連する情報がないため、ディレクトリテーブルにファイルがまだ存在していると思われます。ときにlsしようとは、ファイル自体に関する情報を取得するには、それ自体がもはや存在しないファイルなどのエラー(それが唯一のディレクトリテーブルである)、したがって、表示されたエラーを取得します。次にls、ディレクトリテーブルにあるため、ファイル名を出力します。1つのケースに疑問符が付いているが、他のケースにはないという事実は、lsIMHOの表示バグ(問題とは無関係)が原因です。


私は以前にワイルドカードを試しましたが、機能しませんでした。質問にその試みを投稿できませんでした。結果を更新します
mike-m 14

3番目の編集を参照してください。これは、NFS(おそらく破損ではなく、キャッシングの不良)と、おそらく別のプロセスがディレクトリを使用しているという事実によるものです。場合によっては、すべて(サーバーとクライアント)をリブートする必要があります。
vinc17 14

たぶんこれで説明できるかもしれませんが、テストのためにそれを削除する権限がないので、確信が持てません。5番目の編集を参照してください。
マイクm 14

1
@ vinc17新しい読者には意味がないため(すでに編集履歴があります)
Bernhard 14

IVは、いくつかのlsofの出力ではなく、必ずそれはあなたのカントー何かを伝えることができるかどうか、追加
マイク-メートル

3

私はfind-execディレクティブを使用して個人的にテストしました:

$ mkdir -p mikeaâcnt
$ ls
mikeaâcnt
$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
$ ls
$ 

フォルダーは正しく作成され、正しく削除されました。

@Igeorgetが指摘したように、GNUを使用している場合はさらに簡単な方法がありますfind

$ find -maxdepth 1 -type d -empty -delete

このコマンドもテストしましたが、正しく機能します


また、GNUのfindを使用する場合、-deleteオプションもあります。
lgeorget 14

3番目の編集を参照してください
mike-m 14

1

私も同じ問題を抱えていたと思う。私は以前のファイル名の問題を見てきました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 (&#x00E2;)
U+0081 <control> character (&#x0081;)
U+0084 <control> character (&#x0084;)
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 (&#x2044;)
U+0063 LATIN SMALL LETTER C character
U+006E LATIN SMALL LETTER N character
U+0074 LATIN SMALL LETTER T character

したがって、ファイル名は次のとおりmikea⁄cntです。通常のフォワードスラッシュではなく、小数スラッシュを使用します。この名前をに渡すことができますrmdir


それは独創的です、私がこれに再び会ったら、これを覚えておいてください。良いもの。+1
mike-m

0

ファイル/フォルダ名の正しい16進コードを取得した後(適切と思われる任意の方法を使用して、私は選択することができますls --show-control-chars | xxd)、bashの下で実行するときにそのような文字に対処するためにいくつかの特別な構造を使用する必要があります:

rmdir $'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'

それ以外の場合、バックスラッシュはバニラバックスラッシュとして扱われます。


私の編集(8回目の編集)をご覧ください
mike-m 14

@ mike-mもちろん、これlsは存在しません。出力データに改行が含まれており、「cnt」が重複しているためです。多分あなたは私の答えの行を直接コピーして貼り付けて、それが効果的かどうかを試すことができますか?
アベルチャン

いいえ``
マイク-M

その場合、NFSの問題とロケールの組み合わせにより、ほとんどのシステムユーティリティが不正な非UTF8バイトを渡すことを妨げる可能性が非常に高くなります。そして、iノードの削除により状況が悪化したようです。今のところ、私は考えることができる唯一の方法は、(使用のための「C」ロケールロケールのない環境にシステムを設定しているLC_*と、LANG任意の文字セットオプションなしのenv変数)、およびNFSマウント
アベルチャン

0

rm -rf ./mikeaâcntまたはrm -rf "./mikeaâcnt"または絶対パスを使用してみましたか?代わりにrm、試してみてくださいrmdir ./mikeaâcnt


問題の一部は、の文字があることを mikeaâcnt、ファイル名ではないようですが、何を ls ディスプレイには、第三編集を参照
マイク-メートル

0

あなたがそのファイルのinodeを取得しようとしていますstat

stat mike*

これにより、iノード番号(およびその他のデータ)が得られ、削除を試みることができます。


ivに動作をstat伴う編集が追加されました
mike-m 14

0

同様の問題がありました。Gnome、KDE、または何らかのXwindow DMをお持ちですか?ファイルブロッサーを開いてそこからファイルを削除した場合。

動作するはずです。

コマンドラインから解決策を見たいのですが、私の場合、コマンドラインからそれを削除する方法を見つけようとして多くの時間を失った後、私はそれがnautilusから他のファイルを削除するか、その他のファイルエクスプローラー(真実はnautilusでのみ試したことです)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.