Я зробив помилку минулої ночі, яка ненавмисно видалила 1800 ГБ мого файлового сервера


27

Я виконував цю команду вчора, я думав на тестовій машині, але це був файл-сервер, підключений через SSH.

sudo rm -rf /tmp/* !(lost+found)

Мій термінальний емулятор - Konsole. Моя система - Debian 7.

Питання:

Чи видаляла ця команда інші файли, крім файлів в / tmp?


Може бути, що / домашня файлова система не змонтована?
Еммануїл

@Emmanuel Я підтвердив, що файли втрачені.
Щось щось

1
У вашій історії не відображаються помилки при видаленні. Ви вбили багато процесів операційної системи, роблячи "kill $ (lsof / usr ...)". Можливо, це вплинуло на дімона файлової системи. Ви намагалися перезапустити служби чи перезавантажити файл?
Еммануїл

1
@somethingSomething Konsole не є оболонкою, це емулятор терміналу KDE за замовчуванням. Спробуйте ввести деякі символи в терміналі, наприклад, dsgsadfsfі натисніть клавішу Enter. Побачити результат. Якщо це так bash: dsgsadfsf: command not found, то ваша оболонка є bash.
Габор Фаркас

5
Сподіваюся, у вас є гарні резервні копії. Якщо ви збираєтеся спробувати відновити, припиніть користуватися цією системою, поки не зможете зробити байтову копію накопичувача на експерименті. Будь-яке записування до відповідної файлової системи призведе до посилення шкоди.
CVn

Відповіді:


43

Правильний синтаксис в bash такий:

rm /tmp/!(lost+found)

Як @goldilocks писав у коментарях, оригінальна команда робить розширення запиту (видаляє всі файли в /tmpпапці, потім продовжує і видаляє всі файли в поточній робочій папці, у вашому випадку homeпапку).

Ви можете спробувати перевірити, чи можете ви відновити деякі дані. Існує питання про Linux відновлення даних тут .


28
Так, це, по суті, інший випадок відомого "пропущеного простору в моєму командному рядку, який знищив усі мої дані" - так само, як у rm -rf / tmp^^
Мартін фон Віттіч

8
Не можу підкреслити, що параноя сисадміну не є безпідставною. :) Завжди створюйте резервні копії своїх найцінніших даних у місці, де ви можете писати лише як root.
Габор Фаркас

9
Я вважаю за краще створити резервну копію на окремому жорсткому диску або сервері, який навіть не підходить для кореневої корекції під час звичайних обставин. ОП використовується sudo, тому звичайна папка, що записується лише для root, не обов'язково допомогла б.
Мартін фон Віттіх

Добре, що я не приділяв належної уваги ОП. Сервер може бути дорогим, однак окремий диск досить справедливий. Я використовував окремий розділ, який за замовчуванням відключений. Просто і брудно, але ефективно.
Габор Фаркас

1
@simonzack це може зменшити ймовірність аварій, встановивши її, отже, мені достатньо :)
Gabor Farkas

26

Можливо, !(lost+found)ваша rmкоманда була фатальною помилкою:

1978  rm -rf /tmp/* !(lost+found)
1979  sudo rm -rf /tmp/* !(lost+found)

Я точно не знаю, що bashз цим робити, але ця команда нижче друкує все в моєму, /tmp/а також все моє поточне каталогу (яке є в даний час ~):

echo /tmp/* !(lost+found)

Це !(folder)частина команди, яку я колись виконував, і видалила всі, крім folder.
somethingSomething

3
Це звучить як щось, що може працювати з zsh; баш, я не думаю. Я отримую !lost+found: event not foundяк !використовується для отримання команд з історії.
wurtel

9
Yikes! "Я не знаю, що bash робить з цим" -> це виконує розширення. Вгадайте, що таке "все, крім цього"? cd /; echo !(lost+found)> _ <
goldilocks

13
Будь ласка, майте на увазі, що !(foo)працює в bash як "все, крім foo", лише якщо встановлено extglobпараметр. Більше того, OP не вказав, яку оболонку він використовує, тому насправді важко здогадатися, що саме rm !(lost+found)команда виконала у його випадку.
jimmij

5
Чудове зауваження, хоча ОП заявив, що він використовує Debian 7, який має bashоболонку за замовчуванням. Він, швидше за все, цього не змінив. Крім того, у Debian 7 extglobпараметр trueза замовчуванням встановлений (я щойно перевірив це).
Габор Фаркас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.