Czy mamy cofnięcie w systemie Linux?

Odpowiedzi:

53

Linux (podobnie jak inne jednorożce) nie ma wbudowanej funkcji cofania. Filozofia jest taka, że ​​jeśli zniknie, zniknie. Jeśli było to ważne, powinno zostać zarchiwizowane.

Istnieje system plików bezpieczników, który automatycznie przechowuje kopie starych wersji: copyfs , dostępnych we wszystkich dobrych dystrybucjach. Oczywiście może to zużywać wiele zasobów.

Najlepszym sposobem ochrony przed takimi wypadkami jest użycie systemu kontroli wersji (cvs, bazar, darcs, git, mercurial, subversion, ...). Nauka zajmuje trochę czasu, ale w średniej i długiej perspektywie bardzo się opłaca.

Gilles „SO- przestań być zły”
źródło
1
dobrą alternatywą może być gitfs, który jest w trakcie
opracowywania
1
Cóż, jeśli przypadkowo usuniesz lub nadpiszesz plik, którego nie przygotowałeś ani nie zatwierdziłeś, nawet CVS nie pomoże
xdevs23,
14

Niestety nie.

postfuturist
źródło
19
Nie wiem, czy uważam to za niefortunne ... Realizacja cofnięcia zajęłaby sporo zasobów. Nie podoba mi się nawet -iopcja rmdomyślnie włączona. Moje systemy uniksowe nie powinny trzymać mnie za rękę.
ksenoterrakid
5
-i jest domyślnie włączone ?! nie moja dystrybucja, nie proszę pana!
Stefan
9

Nie, nie ma magicznego cofnięcia w żadnym Uniksie. Unix zakłada, że ​​wiesz, co robisz. Do obsługi cofania użyj VCS (twój edytor tekstowy prawdopodobnie też go ma wbudowany).

Większość systemów plików nie ma możliwości robienia tego transparentnie.

Wehikuł czasu i przywracanie systemu odpowiednio w systemie Mac i Windows są po prostu systemami kontroli tworzenia kopii zapasowych / zmian.

ksenoterracid
źródło
7

W wierszu poleceń nie ma cofania. Możesz jednak uruchamiać polecenia jako rm -ii mv -i. Pojawi się monit „jesteś pewien?” pytanie przed wykonaniem polecenia.

Możliwe jest również dodanie aliasu do skryptu uruchamiania (np. ~/.bashrcLub /etc/bash.bashrc):

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

Edycja: zgodnie z poniższymi sugestiami usunąłem moją radę aliasu domyślnych poleceń. Zamiast tego wprowadza teraz nowe polecenia).

vdboor
źródło
1
+1. aby dodać tutaj. Po ustawieniu powyższych aliasów, jeśli w niektórych przypadkach chcesz po prostu usunąć bezpośrednio bez monitu „czy jesteś pewien”, możesz użyć \ rm i \ mv do pominięcia aliasu. możesz także użyć opcji -f.
Hemant,
2
mv -ipyta tylko wtedy, gdy zastąpi plik (co czyni go użytecznym i nie wstrętnym). W tym samym duchu alias cp='cp -i'.
Gilles „SO- przestań być zły”
8
Aliasing rm i mv to bardzo zły pomysł. (rm jest gorszy ze wszystkich.) Nigdy nie przyzwyczajaj się używać rm do oznaczenia rm -i - w końcu użyjesz go gdzieś, gdzie alias nie jest zdefiniowany i usuniesz coś na dobre. Jeśli chcesz otrzymywać monity, przez cały czas używaj rm -i.
msakr
Jeśli chcesz otrzymać monit, użyj aliasu pod inną nazwą. Używam move = 'mv -i', copy = 'cp -i', symlink = 'ln -si', i instaluję polecenie kosza, aby użyć zamiast rm. Nadal używam mv, cp i rm bezpośrednio podczas pisania skryptów, ale do użytku interaktywnego te aliasy są przydatne.
@mahmoudsakr Masz całkowitą rację, przegapiłem ten punkt. Nie mam też tych aliasów. Aliasing ich jako innego polecenia wydaje się najbardziej rozsądną opcją!
vdboor
4

Powód, dla którego systemy Linux / Unix nie mają cofniętego usunięcia, wynika ze sposobu, w jaki większość systemów plików przechowuje swoje informacje. Meta-informacje pliku są przechowywane z przodu dysku z odniesieniami do i-węzłów na pozostałej części dysku. Zazwyczaj większość systemów plików przydziela 10 bloków do pliku w tym obszarze meta. Pierwsze 7 odnosi się do pierwszych 7 i-węzłów. Ósmy i dziewiąty to listy i-węzłów (podwójnie połączone bloki), a dziesiąte - lista list (potrójne połączone bloki). Różni się to w zależności od systemu plików (ext4, jfs, xfs itp.), Ale te listy bloków mogą zwykle dotyczyć plików o wielkości od 2 GB do kilku TB.

Ponieważ jednak wszystkie te informacje są przechowywane z przodu dysku, po usunięciu pliku nie ma sposobu, aby odwoływać się do i-węzłów na dysku, do jakich metadanych, do których należą. W przeciwieństwie do FAT32 i NTFS przechowują pewne informacje nagłówkowe w samych plikach, co ułatwia identyfikację, do którego pliku należy zestaw bloków (o ile to miejsce nie zostało jeszcze odzyskane przez nowsze pliki). W pracy z Linuksem, kiedy coś usuwasz, prawie zawsze pierwszą rzeczą jest natychmiastowe zastąpienie przez nowe dane w celu zwiększenia wydajności.

djsumdog
źródło
2

Jeśli naprawdę chcesz cofnąć operację, użyj kontroli źródła. Subversion faktycznie działa bardzo dobrze na maszynie jednego użytkownika. Używam go do kontrolowania wszystkich moich osobistych plików w moim systemie domowym. Wydaje się, że to przesada, aż do katastrofy, nieuczciwego skryptu lub literówki w wierszu poleceń.

Stephen Jazdzewski
źródło
1
rm -r .Jednak to cię nie ochroni . ;)
Umang
1
@Umang Zrobiłem to kiedyś z git, gdzie przypadkowo prowadzę lokalne repozytorium rm -r project.git. Na szczęście, jeśli trzymasz inną wersję na zdalnym serwerze, co jest mało prawdopodobne
phunehehe
1
@phunehehe i ktokolwiek dał +1 mojemu komentarzowi: jesteśmy zbyt przyzwyczajeni do DVCS, aby zdać sobie sprawę, że całkowicie się myliłem. SVN zatwierdza repozytorium (które nie jest oddziałem). Więc będzie rzeczywiście być chroniony rm -r .. Naprawdę głupie z mojej strony.
Umang,
2

Jedną z rzeczy, które lubię dodawać do mojego .bashrc, jest funkcja kopiowania i usuwania. Coś jak:

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

Ale musisz nabrać nawyku pisania cprm, a nie rm.

Oczywiście musisz zachować kontrolę nad usuniętym obszarem, jeśli masz ograniczone miejsce na dysku.


źródło
4
naprawdę możesz to skrócić do mv $ 1 ~ / usunięte / 1 $
Stefan
Tak, i to będzie zastąpić plik „nowy dokument 1” z innym „Nowy dokument 1”, jeśli masz cytując rację "$1".
użytkownik nieznany
@ userunknown: czy masz na myśli 1 $ w kodzie Deano, a kod Stefana powinien być cytowany jako „1 $”?
Tim
@Tim: Tak, rozumiem.
użytkownik nieznany
Dlaczego nie przenieść się zamiast CP i RM?
user1559897