У нас есть отмена в Linux?

Ответы:

53

Linux (как и другие юниты) изначально не предоставляет функции отмены. Философия заключается в том, что если он ушел, он ушел. Если бы это было важно, это должно было быть поддержано.

Существует файловая система fuse, которая автоматически хранит копии старых версий: copyfs , доступные во всех хороших дистрибутивах. Конечно, это может использовать много ресурсов.

Лучший способ защититься от таких аварий - использовать систему контроля версий (cvs, bazaar, darcs, git, mercurial, subversion, ...). Это займет немного времени, чтобы учиться, но это окупается в среднесрочной и долгосрочной перспективе.

Жиль "ТАК - перестань быть злым"
источник
1
хорошей альтернативой могут быть gitfs, который находится в стадии разработки
test30
1
Хорошо, если вы случайно удалили или перезаписали файл, который вы еще не
создали
14

К сожалению нет.

postfuturist
источник
19
Я не знаю, что я считаю это неудачным ... Потребовалось бы немало ресурсов, чтобы осуществить отмену. Мне даже не нравится -iопция rmвключения по умолчанию. Мои системы Unix не должны держать меня за руку.
ксенотеррацид
5
-i включен по умолчанию ?! не мой дистрибутив, нет, сэр!
Стефан
9

Нет, никакой магической отмены нет ни в одном Unix. Unix предполагает, что вы знаете, что делаете. Для поддержки отмены используйте VCS (возможно, в вашем текстовом редакторе он тоже есть).

Большинство файловых систем не имеют возможности сделать это прозрачно.

Time machine и восстановление системы на Mac и Windows соответственно являются просто системами резервного копирования / изменения.

xenoterracide
источник
7

В командной строке нет отмены. Однако вы можете запускать команды как rm -iи mv -i. Это подскажет вам «вы уверены?» вопрос, прежде чем они выполнят команду.

Также возможно добавить псевдоним для него в сценарий запуска (например, ~/.bashrcили /etc/bash.bashrc):

alias remove='rm -i'
alias move='mv -i'

Редактировать: в соответствии с приведенными ниже советами, я удалил мой совет, чтобы псевдоним команды по умолчанию. Вместо этого он вводит новые команды сейчас).

vdboor
источник
1
+1. просто чтобы добавить сюда. После установки выше псевдонимов, если в некоторых случаях вы хотите просто удалить напрямую без запроса «вы уверены», вы можете использовать \ rm и \ mv для обхода псевдонима. Вы также можете использовать опцию -f.
Hemant
2
mv -iподсказки только тогда, когда это перезапишет файл (что делает его полезным и не противным). В том же духе alias cp='cp -i'.
Жиль "ТАК ... перестать быть злым"
8
Aliasing rm and mv - очень плохая идея. (rm хуже всех.) Никогда не имейте привычку использовать rm для обозначения rm -i - вы в конечном итоге будете использовать его там, где псевдоним не определен, и вы удалите что-то навсегда. Если вам нравится, когда вас приглашают, привыкните постоянно использовать rm -i.
msakr
Если вам нравится подсказка, используйте псевдоним под другим именем. Я использую move = 'mv -i', copy = 'cp -i', symlink = 'ln -si' и устанавливаю команду мусора для использования вместо rm. Я все еще использую mv, cp и rm напрямую при написании сценариев, но для интерактивного использования эти псевдонимы удобны.
@mahmoudsakr Вы совершенно правы, я упустил этот момент. У меня нет этих команд псевдонимов либо. Псевдоним их как другой команды кажется самым вменяемым вариантом!
vdboor
4

Причина того, что системы Linux / Unix не имеют восстановленных данных, связана с тем, как большинство файловых систем хранят свою информацию. Все метаинформация файла хранится в передней части диска со ссылками на иноды на остальной части диска. Как правило, большинство файловых систем выделяют 10 блоков для файла в этой мета-области. Первые 7 относятся к первым 7 индексам. 8-й и 9-й переходят к спискам инодов (блоки с двойной связью), а 10-й - к спискам списков (блоки с тройными связями). Это варьируется от файловой системы к файловой системе (ext4, jfs, xfs и т. Д.), Но эти списки блоков обычно могут адресовать файлы размером от 2 ГБ до нескольких ТБ.

Но поскольку вся эта информация хранится в передней части диска, при удалении файла нет способа ссылаться на иноды на диске, к каким метаданным они относятся. Напротив, FAT32 и NTFS фактически хранят некоторую информацию заголовка вместе с самими файлами, что упрощает определение того, к какому файлу должен принадлежать набор блоков (при условии, что это пространство еще не было освобождено новыми файлами). В работе с Linux, когда вы что-то удаляете, это почти всегда первое, что немедленно перезаписывается новыми данными для повышения эффективности.

djsumdog
источник
2

Если вы действительно хотите отменить функцию, используйте контроль источника. Subversion на самом деле очень хорошо работает на однопользовательском компьютере. Я использую его для контроля всех моих личных файлов в моей домашней системе. Это кажется излишним, пока не произойдет катастрофа, мошеннический сценарий или опечатка командной строки.

Стивен Яздевский
источник
1
Это не защитит вас от этого rm -r .. ;)
Уманг
1
@Umang Я действительно однажды сделал это с помощью git, где я случайно и случайно сохранил локальный репозиторий rm -r project.git. К счастью, если вы сохраните другую версию на удаленном сервере, это вряд ли произойдет
phunehehe
1
@phunehehe и кто бы ни добавил мой комментарий: мы слишком привыкли к DVCS, чтобы понять, что я был совершенно неправ. SVN фиксирует репо (который не является филиалом). Таким образом , вы будете на самом деле быть защищены rm -r .. Действительно глупо с моей стороны.
Уманг
2

Одна вещь, которую я хотел бы добавить в мой .bashrc - это функция копирования и удаления. Что-то вроде:

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

Но вы должны привыкнуть печатать cprm, а не rm.

Очевидно, что вам нужно оставаться поверх удаленной области, если у вас ограниченное дисковое пространство.


источник
4
Вы могли бы действительно сократить это до mv $ 1 ~ / Удаленный / $ 1
Стефан
да, и он будет перезаписать файл «новый документ 1» с другой «новый документ 1», если вы получаете право процитировать: "$1".
пользователь неизвестен
@userunknown: вы имеете в виду 1 доллар в коде Деано и Стефана, которые должны быть указаны как «1 доллар»?
Тим
@ Тим: Да, я делаю.
пользователь неизвестен
Почему бы не двигаться вместо cp и rm?
user1559897