Что делает «rm -r ~» в моем домашнем каталоге?

16

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

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

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

Появилось сообщение, что некоторая директория не может быть удалена, и я покинул команду. Вопрос: что я удаляю?

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

    
задан GUI Junkie 29.06.2012 в 08:48
источник

2 ответа

31

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

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 ) до preview , если вы хотите рекурсивно удалить выбранные файлы. . Вы должны попытаться сделать это редким явлением, но если вам нужно ...

    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 .

    
ответ дан Lekensteyn 13.04.2017 в 12:14
источник
5

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

Подробнее о том, как работает расширение тильды, см. Ссылка .

    
ответ дан geirha 29.06.2012 в 08:57