rm: отказ от удаления '.' или каталог '..': пропуская '..'

Почему, когда я пытаюсь удалить .. из каталога, я получаю сообщение об ошибке:

rm: refusing to remove '.' or '..' directory: skipping '..'

И прежде чем вы спросите, почему я хочу это сделать: Просто потому, что.

-2
18.12.2019, 20:12
2 ответа

Это защита, добавленная к большинству реализаций rm для устранения неправильной функции некоторых оболочек (включая оболочки POSIX), где rm -rf .* рекурсивно удаляет содержание . и .. , а также (это было исправлено оболочкой Forsyth и производными (например, pdksh), zsh и fish по крайней мере) .

Вы можете использовать rm, встроенную в zsh (оболочка, в которой нет этого недостатка).

zmodload zsh/files # to load and enable the builtin version of rm
                   # and a few other utilities
rm -rf ..

Альтернативно, с GNU find или совместимым, вы можете сделать:

find .. -delete

Просто для ясности, они удаляют содержимое (рекурсивно) родительского каталога (включая текущий рабочий каталог).

Если вы хотите удалить запись .. из текущего каталога, как правило, в современных системах, вы не можете этого сделать. . и .. всегда существуют, пока каталог, содержащий их, существует и не может быть удален. В некоторых файловых системах они даже виртуальные (не являются физическими записями в файле каталога).

Даже если вам удалось их удалить (например, с помощью debugfs для редактирования содержимого каталогов вручную), они будут воссозданы при следующей проверке файловой системы (fsck) выполняется, и некоторые приложения (например, cd встроенный в оболочки POSIX) даже полностью игнорируют их (cd .. сбривает один компонент пути с хвоста текущего рабочего каталога, как хранится в $PWD независимо от того, есть ли .. в текущем каталоге или нет), а POSIX требует .. в аргументах пути, передаваемых системным вызовам, для обозначения родительского каталога независимо от того, существует ли фактическая запись каталога с таким именем в текущем ( или соответствующий для таких путей, как dir/../независимо).

6
28.01.2020, 05:15

Думаю, вам нужна команда:rm -rf *Я думаю, что rm -rf.*работает и со скрытыми файлами? Не уверен.

Но УБЕДИТЕСЬ, что вы находитесь в текущем каталоге, из которого хотите это запустить. Другими словами, введите pwdили echo $PWD, чтобы убедиться....

Так что да, это удалит все файлы в текущем каталоге.

Я также уверен, что rm -rf../*будет работать, так как я проверил это. Вы можете добавить столько родительских каталогов ("../" ), сколько пожелаете.

В общем, просто добавьте «знак» в конце, чтобы обойти дурацкую систему безопасности.

0
28.01.2020, 05:15

Теги

Похожие вопросы