Чому я не можу видалити "." каталог?


40

Я спробував видалити '.' каталог. Я думав, що я можу просто видалити свою робочу директорію, не входячи в батьківський каталог.

Суть мого питання полягає в пошуку деякого розуміння того, як працює система Linux для видалення файлів.


1
Спробуйте rm -r 'pwd', щоб видалити поточний dir, не переходячи на батьківський dir
faadi

7
Це питання не дублює це. Це запитує, чому жорсткий зв’язок існує як фізична сутність, а не синтезується. Це запитання задає не тільки, чому rm .і rmdir .не працюють, а й те, чому вони визначаються як непрацюючі, що не залежить від фізичного існування жорсткого зв’язку.
JdeBP

9
Зображення ви піднялися на дерево, щоб відрізати гілку. На якій стороні розрізу ви сидите, коли починаєте бачити? (Це файлова система Linux в двох словах.)
michael

7
Уявіть, що ви робите rm -rf .*лише для того, щоб знайти це, включаючи не тільки, .але і .., а потім ../.., а потім…
gerrit

Відповіді:


89

Видалення поточного каталогу не впливає на цілісність файлової системи або її логічну організацію. Запобігання .видаленню виконується відповідно до стандарту POSIX, який зазначено на rmdir(2)сторінці керівництва:

Якщо аргумент шляху посилається на шлях, кінцевим компонентом якого є крапка або точка-крапка, rmdir () вийде з ладу.

Одне обґрунтування можна знайти на rmсторінці керівництва:

Утиліта rm забороняє видаляти імена dot і dot-dot, щоб уникнути наслідків випадкового вчинити щось на зразок:

rm -r. *

З іншого боку, явне видалення поточного каталогу (тобто, зазначення його повного або відносного шляху) - це дозволена операція під Unix, принаймні з часу SVR3, як це було заборонено для Unix версії 7 до SVR2. Це дуже схоже на те, що відбувається, коли ви видаляєте файл, який активно читається або записується. Процеси доступу до файлу видалення продовжують операції з читання та запису так само, якби нічого не сталося. Після того, як ви видалили поточний каталог процесу, цей каталог стає не більш доступним, хоча його шлях, але його inode залишається у файловій системі до тих пір, поки процес не помре або не змінить власний каталог.

Зауважте, що процес не зможе використати шлях відносно поточного каталогу для зміни свого cdd (наприклад cd ..), оскільки ..в поточному каталозі більше немає запису.

Коли хто - то тип rmdir ., вони , ймовірно , чекають , що поточна запис каталогу бути видалена , але коли каталог видаляються ( з допомогою шляху), три записи каталогу фактично вилучена, ., ..і каталогу сам.

Видалення лише .цього каталогу, а не введення цього каталогу, створило б невідповідний каталог, але, як уже було зазначено, це заборонено стандартом.

Як справедливо зазначав @Emmanuel, є друга причина, чому видалення .заборонено. Існує щонайменше одна сумісна з POSIX ОС (Mac OS X з HFS +), яка з сильними обмеженнями підтримує створення жорстких посилань на існуючі каталоги. У такому випадку всередині каталогу немає чіткого способу дізнатися, яке жорстке посилання - це таке, яке очікується видалити.


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "Сенс видалення назви шляху / крапки незрозумілий, оскільки ім'я файлу (каталогу) у батьківському каталозі, який потрібно видалити, не ясно, особливо за наявності декількох посилань на каталог "
Еммануїл

@Emmanuel Видалення каталогу, який містить більше двох посилань (тобто не порожній), вже заборонено дизайном (не порожній каталог). Каталог із кількістю посилань одиниці заборонений стандартом (принаймні, для файлових систем, де кількість посилань має значення).
jlliagre

3
@jlliagre: справа не в каталозі, що містить кілька посилань, а в каталозі, що містить кілька посилань. Деякі файлові системи та / або операційні системи забороняють це, але не всі.
Йорг W Міттаг

@ JörgWMittag Каталог, що містить декілька каталогів, має декілька посилань за дизайном, оскільки всі його підкаталоги ..посилаються на нього. Це унікальний випадок link count > 2для переважної більшості ОС та файлових систем, тому "деякі файлові системи та / або операційні системи" є заниженням. Єдиний відомий неісторичний виняток - Mac OS X з HFS +, який додає обмеження щодо того, хто і що можна зробити. Отриманий коментар POSIX спрямований на цю дивацтво. Дивіться unix.stackexchange.com/questions/22394/…
jlliagre

Гей, я робив rm -r .*раніше, і це видувало все в батьківському каталозі рекурсивно ... Це було більше десяти років або двох тому, але приємно знати, що це rmбільше не дозволяє.
antak

9

Це робиться так для цілісності, оскільки ви зараз перебуваєте всередині цього каталогу, і .це лише самовідсилання.

Вам потрібно або перейти до його батька, або зателефонувати rmdirз його шляху, який можна зробити за допомогою:

rmdir `pwd`

Якщо вам це часто потрібно, ви можете встановити йому псевдонім на зразок:

alias rmc='rmdir `pwd`'

.. який може бути викликаний rmcокремо для видалення поточного каталогу.


13
Але чому / як гіпотетична rmdir .команда компрометує цілісність файлової системи таким чином, rmdir $(pwd)чи rmdir "$PWD"ні?
G-Man каже: "Відновіть Моніку"

4
Це не питання цілісності ФС, а логічної організації. Вибравши поточний каталог, ви скажете оболонці використовувати цей каталог для своїх майбутніх операцій, але ви не можете щось видалити з себе.
Джулі Пелтьє,

7
Я боюся, що це виглядає химерно.
Еммануель

4
@FranklinPiat Я не вважаю ваш коментар особливо корисним: 1. Де використовується ОП rm *, і що ви маєте на увазі під історією оболонки? 2. Відповідь стосувалася, чому частина, 3. Докладно розробити?
JBentley

4
@ G-Man, якщо ви це зробите rmdir $(pwd), pwdз'ясовує, наприклад, логічне ім'я для поточного каталогу, /foo/bar/bazа потім rmdir, побачивши цей шлях, видаляє bazзапис із /foo/barкаталогу, за умови виконання умов. Це має сенс. Команда rmdir ., з іншого боку, - це інструкція видалити .запис із поточного каталогу, що не дозволено (це порушило б обмеження, що кожен каталог має .запис, що вказує на себе), ні корисною (воно не видалило б посилання ви хотіли видалити).
варення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.