Mengapa saya tidak bisa menghapus '.' direktori?

40

Saya mencoba menghapus '.' direktori. Saya pikir saya bisa menghapus direktori kerja saya tanpa harus masuk ke direktori induk.

Inti dari pertanyaan saya adalah mencari beberapa wawasan tentang bagaimana sistem linux bekerja untuk menghapus file.

Goldname
sumber
1
Coba rm -r 'pwd' untuk menghapus dir saat ini tanpa benar-benar pindah ke dir induk
faadi
7
Pertanyaan ini tidak menduplikasi pertanyaan itu. Yang itu bertanya mengapa hard link ada sebagai entitas fisik, daripada disintesis. Pertanyaan ini tidak hanya menanyakan mengapa rm .dan rmdir .tidak berhasil, tetapi mengapa mereka ditetapkan sebagai tidak berfungsi, yang tidak tergantung pada keberadaan fisik tautan keras.
JdeBP
9
Gambar Anda telah memanjat pohon untuk memotong cabang. Di sisi potongan mana Anda duduk saat mulai melihat? (Singkatnya, sistem file Linux.)
michael
7
Bayangkan melakukan rm -rf .*hanya untuk menemukan ini termasuk tidak hanya .tetapi juga .., dan kemudian ../.., dan kemudian ...
gerrit

Jawaban:

89

Menghapus direktori saat ini tidak memengaruhi integritas sistem file atau organisasi logisnya. Mencegah .penghapusan dilakukan untuk mengikuti standar POSIX yang menyatakan di rmdir(2)halaman manual:

Jika argumen path merujuk ke path yang komponen terakhirnya adalah dot atau dot-dot, rmdir () akan gagal.

Satu alasan dapat ditemukan di rmhalaman manual:

Utilitas rm dilarang untuk menghapus nama dot dan dot-dot untuk menghindari konsekuensi melakukan sesuatu seperti:

rm -r. *

Di sisi lain, menghapus direktori saat ini secara eksplisit (yaitu dengan menyatakan path lengkap atau relatifnya) adalah operasi yang diperbolehkan di bawah Unix, setidaknya sejak SVR3 karena itu dilarang dengan Unix versi 7 hingga SVR2. Ini sangat mirip dengan apa yang terjadi ketika Anda menghapus file yang sedang aktif dibaca atau ditulis. Proses mengakses file hapus melanjutkan operasi baca dan tulis mereka seperti jika tidak ada yang terjadi. Setelah Anda menghapus direktori proses saat ini, direktori ini tidak lagi dapat diakses melalui jalurnya tetapi inode-nya tetap ada pada sistem file hingga proses tersebut mati atau mengubah direktori sendiri.

Perhatikan bahwa proses tidak akan dapat menggunakan jalur relatif ke direktori saat ini untuk mengubah cwd-nya (misalnya cd ..) karena tidak ada lagi ..entri dalam direktori saat ini.

Ketika jenis seseorang rmdir ., mereka cenderung mengharapkan masuknya direktori saat ini untuk dihapus tetapi ketika sebuah direktori dihapus (menggunakan jalurnya), tiga entri direktori yang benar-benar dihapus, ., .., dan direktori itu sendiri.

Menghapus saja .dan bukan entri direktori ini akan membuat direktori yang tidak patuh tetapi sebagaimana telah dinyatakan, itu dilarang oleh standar.

Seperti @Emmanuel tunjukkan dengan benar, ada alasan kedua mengapa penghapusan .tidak diizinkan. Setidaknya ada satu OS yang kompatibel dengan POSIX (Mac OS X dengan HFS +) yang, dengan batasan kuat, mendukung pembuatan hardlink ke direktori yang ada. Dalam kasus seperti itu, tidak ada cara yang jelas dari dalam direktori untuk mengetahui hardlink mana yang diharapkan untuk dihapus.

Jlliagre
sumber
9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "Makna menghapus nama path / dot tidak jelas, karena nama file (direktori) di direktori induk akan dihapus tidak jelas, terutama di hadapan dari banyak tautan ke direktori "
Emmanuel
@Emmanuel Menghapus direktori yang memiliki lebih dari dua tautan (mis. Tidak kosong) sudah dilarang oleh desain (direktori tidak kosong). Direktori dengan jumlah tautan satu dilarang oleh standar (setidaknya dengan sistem file di mana jumlah tautan memiliki arti).
jlliagre
3
@ jlliagre: Ini bukan pertanyaan tentang direktori yang berisi banyak tautan, tetapi direktori yang memiliki banyak tautan. Beberapa sistem file dan / atau sistem operasi melarang ini, tetapi tidak semua.
Jörg W Mittag
@ JörgWMittag Direktori yang berisi banyak direktori memiliki banyak tautan menurut desain, karena semua subdirektori ..terhubung ke direktori tersebut. Ini adalah kasus unik link count > 2untuk mayoritas OS dan sistem file sehingga "beberapa sistem file dan / atau sistem operasi" adalah pernyataan yang meremehkan. Satu-satunya pengecualian yang tidak diketahui adalah Mac OS X dengan HFS + yang menambahkan batasan tentang siapa dan apa yang dapat dilakukan. Komentar POSIX yang diberikan diarahkan ke keanehan ini. Lihat unix.stackexchange.com/questions/22394/…
jlliagre
Hei, saya sudah pernah melakukan rm -r .*sebelumnya dan itu menghapus segalanya di bawah direktori induk secara rekursif ... Itu lebih dari satu atau dua dekade yang lalu, tetapi senang mengetahui bahwa rmtidak lagi mengizinkan ini.
antak
9

Ini dilakukan seperti itu untuk integritas karena Anda saat ini di dalam direktori itu dan .hanya referensi-sendiri.

Anda harus masuk orang tuanya atau menelepon rmdirdengan jalurnya, yang dapat dilakukan dengan:

rmdir `pwd`

Jika Anda sering membutuhkannya, Anda dapat mengatur alias seperti:

alias rmc='rmdir `pwd`'

.. yang bisa disebut rmcsendiri untuk menghapus direktori saat ini.

Julie Pelletier
sumber
13
Tapi mengapa / bagaimana rmdir .perintah hipotetis membahayakan integritas sistem file dengan cara itu rmdir $(pwd)atau rmdir "$PWD"tidak?
G-Man Mengatakan 'Reinstate Monica'
4
Ini bukan masalah integritas FS tetapi organisasi logis. Ketika Anda memilih direktori Anda saat ini, Anda memberi tahu shell untuk menggunakan direktori ini untuk operasi mendatang, tetapi Anda tidak dapat menghapus sesuatu dari dirinya sendiri.
Julie Pelletier
7
Aku takut itu terlihat dugaan.
Emmanuel
4
@FranklinPiat Saya tidak menemukan komentar Anda sangat berguna: 1. Di mana OP menggunakan rm *, dan apa yang Anda maksud dengan sejarah shell? 2. Jawabannya ditujukan pada bagian mengapa , 3. Peduli untuk menguraikan?
JBentley
4
@ G-Man jika Anda melakukannya rmdir $(pwd), mencari pwdtahu nama logis untuk direktori saat ini, misalnya /foo/bar/baz, dan kemudian rmdir, melihat jalur itu, menghapus bazentri dari /foo/bardirektori, asalkan syarat terpenuhi. Ini masuk akal. Perintah rmdir ., di sisi lain, adalah instruksi untuk menghapus .entri dari direktori saat ini, yang tidak diperbolehkan (itu akan melanggar batasan bahwa setiap direktori memiliki .entri yang menunjuk ke dirinya sendiri) atau berguna (itu tidak akan menghapus tautan Anda ingin dihapus).
hobbs