Вы удалили (почти) весь свой домашний каталог!
rm -r something
рекурсивно удаляет файлы и каталоги в / под чем-либо ; он потерпит неудачу только на элементах, для которых у него нет разрешения на удаление, либо потому, что они принадлежат другому пользователю (например, root
), либо потому, что они используются (например, монтируется GVFS).
Если вы не добавите -f
(как в, rm -rf something
), вы получите что-то вроде:
rm: remove write-protected regular file ‘something’?
rm: descend into write-protected directory ‘something’?
В этот момент вы можете прервать работу, и тогда вы, вероятно, поймете, что выполнили неправильную команду.
Предложения сообщества о том, как избежать подобных аварий
Примечание: Сообщество вики, каждый может внести свой вклад.
Для нескольких файлов используйте -i
опцию, чтобы получить подтверждение об удалении файлов или каталогов:
$ rm -ri something/
rm: remove regular file ‘something/file~’? y
rm: descend into directory ‘something’? y
rm: remove regular file ‘something/file’? y
rm: remove directory ‘something’? y
Если вы удаляете из текущего каталога, добавьте к нему префикс, ./
чтобы избежать ошибочного удаления другого места .:
$ cd something
$ rm -v ./*~
removed ‘./file~’
Выше было для демонстрации использования ./
. Если есть подкаталог, вы, конечно, можете его использовать rm -v something/*~
. Осторожно : не думайте, что rm ./.*
удаляет все скрытые файлы в текущем каталоге. Посмотрите этот вопрос о Serverfault для обходных путей для скрытых файлов.
Переместить, а не удалить: вместо рекурсивного удаления файлов, во-первых, я привык перемещать файлы, от которых я хочу избавиться, куда-то еще, прежде чем окончательно удалить их. Если что-то пошло не так, его легко восстановить.
mv -b SOURCE DEST
Используйте find
(возможно, с grep
) для предварительного просмотра, если вы хотите рекурсивно удалить выбранные файлы. Вы должны попытаться сделать это редким явлением, но если вам нужно ...
find
без аргументов рекурсивно перечисляет все файлы / каталоги под текущим. Вы должны попытаться выяснить, man find
как сделать его выборочным (сокровищница), но если вы не хотите беспокоиться, вы можете просто использовать знакомый grep
для фильтрации файлов, которые вы хотите удалить.
- Предположим, я хакер ядра uber-l33t, и меня беспокоит несколько килобайт "примеров" файлов в моем исходном дереве; Я хочу удалить все файлы, содержащие это имя. Поэтому я печатаю
find | grep example
, что дает мне эти 20 файлов. Это выглядит хорошо, так что теперь я иду и удаляю эти точные файлы вместе с rm -v
подробным выводом, упомянутым ранее, через xargs
:
найти | пример grep | XARGS RM-V
который дает мне этот вывод. Такой предварительный просмотр предотвращает проблемы, когда, скажем, вы делаете опечатку и печатаете sample
вместо example
.
Приведенное выше решение не следует использовать, если у вас могут быть имена файлов, содержащие пробелы, символы табуляции, новые строки или кавычки ( "
или '
), так как это приведет xargs
либо rm
к ошибке , либо к фиду с неполными именами файлов, что в худшем случае может привести к удалению неправильных файлы. Безопасный способ сделать это - сделать все find
это с помощью операторов и действий.
Ниже будут показаны все файлы, содержащие слово example
find . -name "*example*"
Если этот список содержит файлы, которые вы хотите удалить, используйте -exec
действие, чтобы передать файлы rm
.
find . -name "*example*" -exec rm -v {} +
См. Использование поиска для получения дополнительной помощи по использованию find
.