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

17

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

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

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

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

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

GUI наркоман
источник
4
Ну, по крайней мере, у меня есть стратегия резервного копирования ... Никакого реального вреда не сделано.
GUI Junkie
2
Хорошо знать; У меня есть политика никогда не использовать, -rесли я не хочу избавиться от всего.
иш
3
Как примечание, rm -r *~ .удалил бы все файлы и папки (в текущем каталоге), соответствующие *~или .. ( .будет игнорироваться rmкак специальное исключение, так как большинство людей не хотят рекурсивно удалять текущий каталог. The *~удаляет все файлы и каталоги в текущем каталоге, которые заканчиваются ~, но не файлы и каталоги в подкаталогах текущего каталога. ) Так что это не то, что вы хотели. Возможно, вы захотите использовать findс -execфлагом рекурсивный просмотр дерева каталогов и без рекурсивного удаления каждого файла, заканчивающегося на ~.
Элия ​​Каган
@EliahKagan, я так думаю, но найти с -exec - это всегда хлопотно. Восстановление домашнего каталога - это больше хлопот :-)
GUI Junkie
1
Информационный: спойте ~символ, не выходя из него (например \~, так:) заставит Bash, ZSH и т. Д. ( rmКоманда в основном) думать, что вы имеете в виду домашний каталог.
Томас Уорд

Ответы:

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

    1. findбез аргументов рекурсивно перечисляет все файлы / каталоги под текущим. Вы должны попытаться выяснить, man findкак сделать его выборочным (сокровищница), но если вы не хотите беспокоиться, вы можете просто использовать знакомый grepдля фильтрации файлов, которые вы хотите удалить.
    2. Предположим, я хакер ядра 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.

Лекенштейн
источник
1
Трубопровод findвыходной grepи xargs rmопасен.
гейра
2
@izx: добавлено mv(моя любимая команда);)
Таккат
1
Я бы хотя бы добавил пример использования findбезопасного способа, который не ломается (и, возможно, удаляет неправильные файлы), если имена файлов содержат пробел, табуляцию, символ новой строки "или 'символы. Например find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
гейра
1
@geirha: почему это find -deleteтак опасно? Я бы сказал что-то здесь, но я не знаю, кроме того, что он недавно нашел и стер мой, /несмотря на пробный запуск без опции, -deleteтолько нашел несколько файлов, которые я хотел удалить. Я вижу, что вы рекомендуете -exec rmвместо этого.
Таккат
3
@Takkat -deleteне опасен, и вы можете безопасно использовать его вместо -exec rm {} +. Я обычно предпочитаю использовать стандартные инструменты и функции, когда это возможно. -deleteэто нестандартное расширение GNU для find, поэтому оно будет нормально работать в Ubuntu, но может не работать в других системах.
гейра
5

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

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

geirha
источник