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

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

破損したtarファイルを解凍して削除できないディレクトリをいくつか入手しました。削除しようとすると見つからないようですが、lsbashと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âcntPythonの試みの出力 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

そして動作が変わり、次のことを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ことができることを知っていましたが、それ以降は昨日のようにもう入ることができませんでした。ファイルが存在します。cdrmdircd...

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

おすすめ記事