Przeczytaj poprzedni koniec pliku, aby odzyskać dane

12

Bardzo stary plik .swp odwrócił plik, który edytowałem, więc jest teraz znacznie krótszy. Od tamtej pory nic nie zrobiłem w tym katalogu, więc bajty bezpośrednio po końcu pliku powinny nadal zawierać moje dane. Jakiej funkcji mogę użyć do odczytania N bajtów z danego adresu pamięci? ddi readzatrzymaj się na granicach plików, chyba że gdzieś przegapiłem opcję.

Obecny rozmiar pliku to 3,2 KB. Nie pamiętam dokładnie, jak duży był ten plik przed jego obcięciem, ale prawdopodobnie nie więcej niż 10 KB. Jak mogę odczytać 10 KB od początku pliku, ignorując granice plików? W porządku, jeśli dane nie są idealnie zachowane, o ile nie muszę zaczynać od zera.

Matthew Bedford
źródło

Odpowiedzi:

18

Zazwyczaj, gdy redaktorzy zapisują pliki, usuwają lub obcinają do 0, uwalniając w ten sposób przydzielone miejsce, a następnie zapisują, co przydziela nowe miejsce. Powoduje to, że system plików umieszcza dane w zupełnie innej fizycznej lokalizacji. Twój pomysł może więc nie działać.

Możesz uzyskać fizyczną lokalizację pliku za pomocą filefraglub hdparm --fibmap, a następnie użyć dddo bezpośredniego odczytania tej fizycznej lokalizacji. Opisałem ten proces w innym kontekście tutaj: /unix//a/85880/30851


W twoim przypadku bardziej prawdopodobne jest, że potrzebujesz ogólnego podejścia do wyszukiwania danych tekstowych ... coś takiego:

strings -n 12 -t d /dev/partition | grep -F 'text snippet'

strings będzie szukał kolejnych danych ASCII (obsługuje również inne kodowania, nie jestem pewien co do UTF-8. Jeśli jest to kod lub angielski, nie będziesz go potrzebować), a także wydrukuje przesunięcie tam, gdzie zostało znalezione.

text snippetpowinien być dokładną, unikalną próbką tekstową, o której pamiętasz, że znajdujesz się w części pliku, którego szukasz [w jednym wierszu]. (Jeśli nie znasz tego dokładnie, możesz zamiast tego skorzystać z wyrażeń regularnych).

-n 12to minimalna długość, której stringsbędzie szukać. 12powinna być długością twojego text snippet. Ten parametr jest opcjonalny, jeśli podany może pomóc strings | grepnieco szybciej.

Odczytywanie całej partycji zajmie dużo czasu, ale jeśli się powiedzie, będziesz mieć przesunięcie, które możesz przesłać, ddaby złapać ogólny obszar, a następnie usunąć rzeczy, które nie należą.

Od tamtej pory nic nie zrobiłem w tym katalogu

Jeśli twój katalog nie jest punktem montowania ... większość systemów plików tak naprawdę nie rezerwuje miejsca „na katalog”, więc ... wszystkie zapisy w całym systemie plików mogą zastąpić szukany bit. W sytuacji odzyskiwania danych zwykle przełączasz całą funkcję w tryb tylko do odczytu.

frostschutz
źródło
Zauważ, że każdy plik jest przechowywany w wielu blokach i zwykle nie są one przechowywane kolejno. Więc stringszlokalizuje tylko niektóre części pliku, chyba że masz ogromne szczęście.
Gilles 'SO - przestań być zły'
3
Wręcz przeciwnie, musiałbyś mieć pecha, aby znaleźć pofragmentowany plik 10 KB. Jeśli znajdziesz tylko część, bardziej prawdopodobne jest, że druga część została w tym przypadku zastąpiona. Ale jeśli nie masz dużo aktywności zapisu w tym systemie plików lub jest to dysk SSD z funkcją natychmiastowego odrzucania, jeśli zapisałeś ten plik kilka razy podczas edycji, możesz znaleźć wiele kopii tego pliku.
frostschutz
3
Polecam strings -n16lub rozsądną minimalną długość, aby przyspieszyć.
Peter Cordes,
Dobrze, dodałem to do odpowiedzi.
frostschutz
4
Wielkie dzięki. Tuż za końcem pliku były tylko śmieci, ale dzięki stringsniemu mogłem znaleźć cały plik gdzie indziej na partycji. To prawie dwa miesiące pracy, której nie muszę robić, i doskonałe przypomnienie, aby zawsze używać kontroli wersji do wszystkiego, co ważne.
Matthew Bedford,