Почему я не могу удалить "." каталог?

40

Я пытался удалить "." каталог. Я думал, что могу просто удалить свой рабочий каталог, не заходя в родительский каталог.

Суть моего вопроса состоит в том, чтобы взглянуть на то, как система linux работает для удаления файлов.

Goldname
источник
1
Попробуйте команду rm -r 'pwd', чтобы удалить текущий
каталог
7
Этот вопрос не дублирует этот. Тот спрашивает, почему жесткая связь существует как физическая сущность, а не синтезируется. Этот вопрос задает не только то, почему rm .и rmdir .не работают, но почему они указаны как не работающие, что не зависит от физического существования жесткой ссылки.
JdeBP
9
Представьте, что вы забрались на дерево, чтобы отрезать ветку. На какой стороне реза вы сидите, когда начинаете пилить? (Это в двух словах файловая система Linux.)
Майкл
7
Представьте себе, что вы делаете это rm -rf .*только для того, чтобы найти это, в том числе не только, .но ..и потом ../.., а потом ...
геррит

Ответы:

89

Удаление текущего каталога не влияет на целостность файловой системы или ее логическую организацию. Предотвращение .удаления выполняется в соответствии со стандартом POSIX, который указан на rmdir(2)странице руководства:

Если аргумент пути ссылается на путь, конечный компонент которого - точка или точка-точка, rmdir () завершится ошибкой.

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

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

рм -р. *

С другой стороны, явное удаление текущего каталога (т. Е. Путем указания его полного или относительного пути) является допустимой операцией в Unix, по крайней мере, начиная с SVR3, поскольку это было запрещено в Unix версии 7 до SVR2. Это очень похоже на то, что происходит при удалении файла, который активно читается или записывается. Процессы, обращающиеся к файлу удаления, продолжают свои операции чтения и записи, как будто ничего не произошло. После удаления текущего каталога процесса этот каталог больше не доступен, хотя его путь, но его inode остаются в файловой системе до тех пор, пока процесс не прекратит работу или не изменит свой собственный каталог.

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

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

Только удаление, .а не запись каталога этого каталога, может создать каталог, не соответствующий требованиям, но, как уже было сказано, он запрещен стандартом.

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

jlliagre
источник
9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html «Смысл удаления pathname / dot неясен, поскольку имя файла (каталога) в родительском каталоге, который нужно удалить, неясно, особенно при наличии нескольких ссылок на каталог "
Эммануэль
@ Emmanuel Удаление каталога, содержащего более двух ссылок (т. Е. Не пустого), уже запрещено проектом (непустой каталог). Каталог со счетчиком ссылок один запрещен стандартом (по крайней мере, в файловых системах, где количество ссылок имеет значение).
Jlliagre
3
@jlliagre: Речь идет не о каталоге, содержащем несколько ссылок, а о каталоге, содержащем несколько ссылок. Некоторые файловые системы и / или операционные системы запрещают это, но не все.
Йорг Миттаг
@ JörgWMittag Каталог, содержащий несколько каталогов, имеет несколько ссылок по своей структуре, потому что все его подкаталоги ..ссылаются на него. Это уникальный случай link count > 2для подавляющего большинства операционных систем и файловых систем, поэтому «некоторые файловые системы и / или операционные системы» являются заниженными. Единственное не историческое известное исключение - это Mac OS X с HFS +, которые добавляют ограничения о том, кто и что можно сделать, хотя. Разумеется, комментарий POSIX направлен на эту странность. См. Unix.stackexchange.com/questions/22394/…
jlliagre
Эй, я делал это rm -r .*раньше, и это рекурсивно уничтожило все, что находится в родительском каталоге ... Это было более десяти или двух лет назад, но приятно знать, rmчто больше этого не позволяет.
Антак
9

Это сделано для целостности, так как вы в данный момент находитесь в этом каталоге, а .это только ссылка на себя.

Вам нужно либо перейти к его родителю, либо вызвать rmdirего путь, что можно сделать с помощью:

rmdir `pwd`

Если вам это часто нужно, вы можете установить для него псевдоним:

alias rmc='rmdir `pwd`'

.. который может быть вызван как rmcодин, чтобы удалить текущий каталог.

Джули Пеллетье
источник
13
Но почему / как гипотетическая rmdir .команда нарушает целостность файловой системы rmdir $(pwd)или rmdir "$PWD"нет?
G-Man говорит: «Восстановите Монику»
4
Дело не в целостности ФС, а в логической организации. Когда вы выбрали свой текущий каталог, вы указываете оболочке использовать этот каталог для ваших будущих операций, но вы не можете удалить что-то из себя.
Джули Пеллетье
7
Боюсь, это выглядит предположительно.
Эммануэль
4
@FranklinPiat Я не нашел ваш комментарий особенно полезным: 1. Где использовался OP rm *, и что вы подразумеваете под историей оболочки? 2. Ответ на вопрос , почему , 3. Уход, чтобы разработать?
JBentley
4
@ G-Man, если вы это сделаете, например rmdir $(pwd), pwdопределит логическое имя для текущего каталога, /foo/bar/bazа затем rmdir, увидев этот путь, удалит bazзапись из /foo/barкаталога, если выполнены условия. Это имеет смысл. Команда rmdir ., с другой стороны, является инструкцией по удалению .записи из текущего каталога, что недопустимо (это нарушило бы ограничение на то, что в каждом каталоге есть .запись, указывающая на себя) и не является полезным (она не будет удалять ссылку). Вы хотели удалить).
Хоббс