Що 'rm -r ~' зробив у моєму домашньому каталозі?


17

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

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

Я думав rm -r *~ .видалити всі файли з цілого дерева, але я написав текст rm -r ~.

Було повідомлення, якийсь каталог не вдалося видалити, і я вийшов з команди. Питання: Що я видалив?

Я помітив, що моєї конфігурації Filezilla вже немає. Чи видаляє ця команда всі приховані каталоги з домашнього редактора?


4
Ну, принаймні, у мене є резервна стратегія ... Ніякої реальної шкоди не було зроблено.
GUI Junkie

2
Добре знати; Я маю політику ніколи не використовувати, -rякщо не хочу позбутися всього.
Останній

3
Як бічна примітка, rm -r *~ .видалити всі файли та папки (у поточному каталозі), що відповідають *~або .. ( .ігнорується rmяк спеціальний виняток, оскільки більшість людей не хочуть рекурсивно видаляти поточний каталог. *~Видаляє всі файли та директорії в поточному режимі, які закінчуються ~, але не файли та каталоги в підкаталогах поточного каталогу. ) Отже, це не те, чого ви хотіли б. Ви, ймовірно, хотіли використовувати findз -execпрапором рекурсивно поглядом по дереву каталогів і нерекурсівние видалити кожен файл , який закінчується на ~.
Елія Каган

@EliahKagan, я думаю, що так, але знайти з -exec - це завжди клопот. Відновлення домашнього режисера - це більше клопоту, хоча :-)
GUI Junkie

1
Інформаційні: співати ~характер , не уникнути цього (наприклад: \~) буде робити Bash, ЗШ і т.д. ( rmкоманда в основному) думаю , ви маєте в виду домашній каталог.
Thomas Ward

Відповіді:


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 ./.*видаляє всі приховані файли в поточному каталозі. Дивіться це серверне запитання за замовчуванням щодо шляхів вирішення проблем прихованих файлів.

  • Переміщення, а не видалення: Замість того, щоб видаляти файли рекурсивно, в першу чергу я звик переміщувати файли, які я хочу позбутися десь ще, перш ніж остаточно їх видалити. Якщо щось пішло не так, його легко відновити.

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

    1. findбез аргументів рекурсивно перераховує всі файли / каталоги під поточним. Вам слід спробувати знайти, man findяк зробити це вибірково (скарбниця), але якщо ви не хочете турбуватися, ви можете просто скористатися знайомим grepдля фільтрування файлів, які ви хочете видалити.
    2. Припустимо, я хакер ядра uber-l33t, і мене турбує кілька КБ файлів "приклад" у моєму вихідному дереві; Я хочу видалити всі файли, що містять це в імені. Тому я набираю find | grep example, що дає мені ці 20 файлів. Це виглядає добре, тому я тепер переходжу та видаляю ці точні файли, а також викладений rm -vраніше багатослівний вихід через xargs:
      знайти | греп приклад | 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небезпечний.
geirha

2
@izx: додано mv(моя улюблена команда);)
Таккат

1
Принаймні я б додав приклад використання findбезпечного способу, який не порушує (і, можливо, видаляє неправильні файли), якщо назви файлів містять пробіл, вкладку, новий рядок "або 'символи. Напр find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha

1
@geirha: чому find -deleteтак небезпечно? Я б сказав щось тут, але я не знаю іншого, ніж це нещодавно знайшов і витер мою, /незважаючи на сухий пробіг, без опції -deleteзнайдено лише кілька файлів, які я хотів видалити. Я бачу, що ви рекомендуєте -exec rmзамість цього.
Таккат

3
@Takkat -deleteне є небезпечним, і його можна сміливо використовувати замість нього -exec rm {} +. Я, як правило, вважаю за краще використовувати стандартні інструменти та функції, коли це можливо. -deleteце нестандартне розширення GNU до find, тому воно буде добре працювати на Ubuntu, але може не застосовуватись в інших системах.
geirha

5

Так. Символ тильди без котирування як окремий аргумент поширюється на ваш homedir. Так rm -r ~розширилися до rm -r /home/yourusename. Отже, ви сказали rm рекурсивно видаляти всі файли у своєму homedir.

Докладніше про те, як працює розширення tilde, перегляньте http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.