Что 'rm -r ~' сделал с моим домашним каталогом?

gedit создает скрытые файлы резервных копий, заканчивающиеся на '~'. Я хотел сделать рекурсивную очистку моего дерева каталогов.

Команда rm *~ удалит все локальные файлы, заканчивающиеся на '~'

Я думал, rm -r *~ . удалит все файлы во всем дереве, но я набрал rm -r ~.

Было сообщение, что не удалось удалить какой-либо каталог, и я вышел из команды. Вопрос в том, что я удаляю?

Я заметил, что моя конфигурация Filezilla исчезла. Удаляет ли эта команда все скрытые каталоги из домашнего каталога?

16
задан 29 June 2012 в 12:58

2 ответа

Вы удалили (почти) весь свой домашний каталог!

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 ./.* удаляет все скрытые файлы в текущем каталоге. См. этот вопрос об ошибке сервера для обхода обхода скрытых файлов.

  • Перемещать, а не удалять: Вместо рекурсивного удаления файлов, во-первых, я привык перемещать файлы, от которых я хочу избавиться, прежде чем удалить их наконец. Если что-то пошло не так, его легко восстановить.

    mv -b SOURCE DEST
    
  • Используйте find (возможно, с grep) для предварительного просмотра , если вы хотите рекурсивно удалить выбранные файлы. Вы должны попытаться сделать это редким явлением, но если вам нужно ...

    1. find без аргументов рекурсивно перечисляет все файлы / каталоги под текущим. Вы должны попытаться найти man find о том, как сделать его выборочным (сокровищница), но если вы не хотите беспокоиться, вы можете просто использовать знакомый grep для фильтрации файлов, которые вы хотите удалить.
    2. Предположим, я хакер ядра uber-l33t, и меня беспокоит несколько килобайт «примеров» файлов в моем исходном дереве; Я хочу удалить все файлы, содержащие это имя. Поэтому я набираю find | grep example, что дает мне эти 20 файлов. Это выглядит хорошо, поэтому я сейчас иду и удаляю эти точные файлы вместе с ранее упомянутым подробным выводом rm -v через xargs:
      find | grep example | xargs rm -v
      , который дает мне этот вывод. Такой предварительный просмотр предотвращает проблемы, когда, например, вы делаете опечатку и набираете sample вместо example.

Приведенное выше решение не следует использовать, если у вас могут быть имена файлов, содержащие пробелы, символы табуляции, новые строки или кавычки (" или '), поскольку это приведет к xargs ] либо потерпеть неудачу, либо введите rm неполные имена файлов, что в худшем случае может привести к удалению неправильных файлов. Безопасный способ сделать вышеупомянутое - сделать все это с помощью операторов и действий find. ​​

Далее будут показаны все файлы, содержащие слово example

find . -name "*example*"  

Если этот список содержит файлы, которые вы хотите удалить, используйте действие -exec, чтобы передать файлы в rm .

find . -name "*example*" -exec rm -v {} +

См. Использование Find для получения дополнительной помощи по использованию find.

0
ответ дан 29 June 2012 в 12:58

Да. Тильда без кавычек в качестве отдельного аргумента распространяется на ваш домашний каталог. Итак, rm -r ~ расширен до rm -r /home/yourusename. Итак, вы сказали rm рекурсивно удалить все файлы в вашем домашнем каталоге.

См. http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion для получения дополнительной информации о том, как работает расширение тильды.

0
ответ дан 29 June 2012 в 12:58

Другие вопросы по тегам:

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