Saya membatalkan untar file tar yang korup, dan berhasil berakhir dengan beberapa direktori yang tidak dapat saya hapus, Jika saya mencoba menghapusnya, sepertinya tidak dapat ditemukan, tetapi ls
menunjukkannya ada, baik dengan bash dan dengan python saya dapatkan perilaku serupa, kecuali tepat setelah saya mencoba menghapusnya rm -rf
, ls
mengeluh tidak dapat menemukannya, lalu mencantumkannya (lihat di bawah setelah rm -rf
). The find
perintah menunjukkan file hadir, tapi masih saya tidak bisa memikirkan cara untuk menghapusnya.
Inilah usaha saya:
Di sini Anda melihat keduanya ls
dan find
setuju kami memiliki direktori,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Tapi saya tidak bisa menghapusnya:
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
Saya bisa cd
melakukannya dan itu kosong:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt
lihat di bawah ini bahwa ini bukan file sederhana tetapi direktori, dan ls
berperilaku lucu setelah rm -rf
dikatakan tidak dapat menemukan file kemudian daftar langsung setelah:
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]$
Jadi ini adalah percobaan dengan python, file ditemukan, tetapi namanya tidak dapat digunakan sebagai nama yang dapat dihapus:
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'
bahkan ketika saya menggunakan penyelesaian tab nama yang diambil tidak dapat digunakan:
rl]$ rm -rf mikeaâ^Á^Äcnt
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
menggunakan nama yang ditampilkan python dengan bash saya mendapatkan ini:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
Apakah ada yang bisa saya lakukan untuk menghilangkan dir yang korup ini? Filesystem yang mendasari (NFS) tampaknya fungsional dan tidak ada masalah lain yang dilaporkan, dan saya tidak punya masalah sampai file tar rusak.
EDIT: Berikut ini menggunakan opsi find
sendiri -exec
untuk meneleponrm
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]$
tetapi file tersebut masih ada, ( ls
mengeluh tidak dapat menemukannya, tetapi kemudian menunjukkannya)
EDIT ke-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
Perilaku masih tidak berubah, file masih ada
EDIT ke-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
Tampaknya ada lebih banyak nama daripada mikeaâcnt
melihat output dari upaya python mikea\xc3\xa2\xc2\x81\xc2\x84cnt
, dan tangkapan layar ini:
Edisi ke-4: Ini adalah upaya dengan kartu liar:
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
dan lokal saya:
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=
Edit ke-5:
rl]$ ls -i
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt
tetapi juga perilaku telah berubah, sekarang ls
dan cd
lakukan ini:
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.
Ini telah terjadi setelah upaya untuk menghapus, saya berpikir bahwa itu mungkin masalah NFS seperti yang disarankan dalam salah satu jawaban di sini oleh vinc17.
EDIT 6: Ini adalah output dari lsof
danls -a
rl] $ / usr / sbin / lsof mikeaâ ^ Á ^ Äcnt lsof: kesalahan status pada mikea \ xc2 \ x81 \ xc2 \ x84cnt: Tidak ada file atau direktori seperti itu
di atas salah, di sini adalah lsof
doa yang benar : (rl adalah direktori induk)
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
Sunting ke-7: pindah tidak akan berfungsi, (saya sudah mencoba sebelum semua ini, tapi saya tidak menyimpan output), tetapi memiliki masalah yang sama seperti ls
dan rm
dengan file.
8 EDIT: ini menggunakan karakter hex seperti yang disarankan:
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]$
Edit ke-9: untuk stat
perintah:
rl]$ stat mikeaâ^Á^Äcnt
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
rl]$
Tampaknya bahkan lebih mungkin dari semua output, ada bug atau perilaku NFS lainnya seperti yang disarankan dalam komentar.
Sunting 10: Ini adalah strace output di intinya karena begitu besar, ini adalah output atau dua perintah ini:
strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
Sunting 11: Jadi sebelum di atas rmdir
saya perhatikan bahwa saya bisa cd
masuk ke direktori, tetapi setelah itu rmdir
saya tidak bisa cd
lagi, mirip dengan kemarin. The .
dan ..
file yang hadir:
rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls -a
. ..
mikeaâ^Á^Äcnt]$ cd ../
Edit Terakhir: Saya melihat admin lokal dan ini ditangani dengan masuk ke server itu sendiri dan menghapus dari sana. Penjelasan dari mereka adalah bahwa itu bisa menjadi masalah dengan set karakter di nama yang tidak pantas.
find
output ke perintah yang berbeda alih-alih hanya menggunakanexec
opsi itu?mv
. mungkin Anda bisa menghapusnya setelah itu. Atau, Anda dapat mencoba memindahkan direktori ke tingkat folder yang lebih dalam (mungkin dengan wildcard) dan kemudian menghapus folder tempat Anda memindahkannya.Jawaban:
Kutipan berikut dari esai ini berpotensi menjelaskan mengapa direktori itu menolak untuk dihapus:
sumber
Salah satu cara untuk menghapus file / direktori seperti ini adalah dengan inode-reference.
Untuk menemukan inode untuk elemen dalam dir saat ini:
Untuk menghapus ini:
sumber
?
sebagai referensi inode-nya. Bagaimana Anda menghapusnya?Anda tidak boleh menggunakan karakter non-ASCII di baris perintah karena seperti yang Anda lihat, untuk beberapa alasan, mereka tidak harus sesuai dengan nama file (Unicode memiliki berbagai cara untuk mengekspresikan huruf beraksen). Sesuatu seperti:
harus bekerja karena nama file langsung dihasilkan oleh shell. Tetapi pastikan hanya ada satu kecocokan (lakukan yang
echo mike*
pertama untuk mengonfirmasi).Nah, jika
cd
berhasil, maka tidak ada alasan mengaparm
atauls
harus mengatakanNo such file or directory
, sehingga masalahnya mungkin pada tingkat sistem file.Catatan: Jangan gunakan
ls
untuk menemukan apakah direktori kosong, tetapils -a
.Direktori masih dapat digunakan oleh proses lain (termasuk jika itu adalah cwd dari beberapa proses). IMHO, itu sebabnya masih "ada" tetapi dapat menghasilkan kesalahan, misalnya dengan
ls
;lsof
mungkin memberi Anda beberapa informasi, tetapi dengan NFS, Anda perlu menemukan mesin mana yang menggunakannya. Terutama dengan NFS, ini dapat menghasilkan kesalahan aneh.ls -a
dalam direktori induk dapat menunjukkan.nfs*
file / direktori kepada Anda dalam beberapa kasus.Ketika Anda mendapatkan:
Saya menduga bahwa file masih ada di tabel direktori karena caching NFS dan / atau karena digunakan oleh proses lain, tetapi tanpa informasi terkait. Ketika
ls
mencoba untuk mendapatkan informasi tentang file itu sendiri, itu mendapat kesalahan karena file itu sendiri tidak ada lagi (hanya ada di tabel direktori), maka kesalahan yang ditampilkan. Kemudianls
menampilkan nama file karena ada di tabel direktori. Fakta Anda memiliki tanda tanya dalam satu kasus tetapi tidak dalam kasus lain adalah karena bug tampilanls
IMHO (tidak terkait dengan masalah Anda).sumber
Saya secara pribadi telah diuji dengan menggunakan
find
's-exec
direktif:Folder itu dibuat dengan benar dan dihapus dengan benar.
Seperti yang ditunjukkan oleh @Igeorget , ada metode yang bahkan lebih sederhana jika Anda memiliki GNU
find
:Saya juga menguji perintah ini, dan berfungsi dengan benar
sumber
-delete
opsi juga.Saya memiliki masalah yang sama, saya percaya. Saya telah melihat masalah sebelumnya dengan nama file
☃
.ls
dalam hal ini ditampilkan file sebagaiâ??
, tetapi saya dapat menghapusnya denganrm ☃
.Ini mengarahkan saya ke cara berikut untuk mengonversi nama yang salah ke yang benar:
Pertama, dapatkan byte dari nama file:
Kemudian decode byte ini sebagai UTF-8, untuk mendapatkan titik kode unicode, menggunakan input heksadesimal dari situs web ini misalnya: http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder
Perhatikan ini semua di bawah batas byte. Kami memperoleh byte berikut:
Jika kami memperlakukan urutan ini di UTF-8 kami mendapatkan:
Dan dengan demikian nama file Anda adalah:,
mikea⁄cnt
dengan potongan kecil alih-alih yang normal. Anda sekarang dapat meneruskan nama ini kermdir
.sumber
Setelah mendapatkan kode hex yang benar dari nama file / folder (menggunakan metode apa pun yang dianggap cocok, saya dapat memilih
ls --show-control-chars | xxd
), beberapa konstruk khusus harus digunakan untuk mengatasi karakter tersebut ketika berjalan di bawah bash:Kalau tidak, backslash diperlakukan sebagai backslash vanila.
sumber
ls
termasuk baris baru dalam data output dan "cnt" digandakan. Mungkin Anda dapat mencoba langsung menyalin dan menempelkan baris dalam jawaban saya dan melihat apakah itu efektif?LC_*
danLANG
variabel env), dan pasang NFS tanpa opsi set karakter apa punSudahkah Anda mencoba menggunakan
rm -rf ./mikeaâcnt
ataurm -rf "./mikeaâcnt"
atau jalur absolut? Juga alih-alihrm
, cobarmdir ./mikeaâcnt
.sumber
mikeaâcnt
tampaknya bukan nama file, tetapi apa yangls
ditampilkan, lihat suntingan ke-3Sudahkah Anda mencoba mendapatkan inode dari file itu dengan
stat
:Itu akan memberi Anda nomor inode (dan data lainnya), dan kemudian Anda bisa mencoba menghapusnya.
sumber
stat
behavour,Saya memiliki masalah serupa. Apakah Anda memiliki Gnome, KDE atau semacam Xwindow DM ?. Jika Anda membuka file broser dan menghapus file dari sana.
Itu harus bekerja.
Saya ingin melihat solusi dari baris perintah, tetapi dalam kasus saya dan setelah kehilangan banyak waktu mencoba mencari cara untuk menghapusnya dari baris perintah saya menemukan bahwa itu sesederhana menghapus file lain dari nautilus atau file explorer lainnya (kebenarannya saya hanya mencoba dengan nautilus).
sumber