Udało mi się zastrzelić w miejscu, w którym boli (naprawdę źle), zmieniając format partycji zawierającej cenne dane. Oczywiście nie było to zamierzone, ale się stało.
Udało mi się jednak wykorzystać testdisk
i photorec
odzyskać większość danych. Więc teraz mam wszystkie te dane rozproszone w prawie 25 000 katalogów. Większość plików to pliki .txt, a pozostałe to pliki obrazów. W każdym katalogu znajduje się ponad 300 plików .txt.
Mogę grep
lub mogę użyć find
do wyodrębnienia niektórych ciągów z plików .txt i przesłania ich do pliku. Na przykład oto wiersz, którego użyłem do sprawdzenia, czy moje dane znajdują się w odzyskanych plikach:
find ./recup*/ -name '*.txt' -print | xargs grep -i "searchPattern"
Mogę wypisać „searchPattern” do pliku, ale to tylko daje mi ten wzór. Oto, co naprawdę chciałbym osiągnąć:
Przejrzyj wszystkie pliki i poszukaj określonego ciągu. Jeśli ten ciąg zostanie znaleziony w pliku, cat CAŁĄ zawartość tego pliku do pliku wyjściowego. Jeśli wzorzec znajduje się w więcej niż jednym pliku, dołącz zawartość kolejnych plików do tego pliku wyjściowego. Zauważ, że po prostu nie chcę wypisywać szukanego wzorca, ale CAŁĄ zawartość pliku, w którym znaleziono wzorce.
Myślę, że jest to wykonalne, ale po prostu nie wiem, jak pobrać całą zawartość pliku po wytłoczeniu z niego określonego wzorca.
źródło
Odpowiedzi:
Jeśli poprawnie zrozumiem twój cel, następujące czynności zrobią, co chcesz:
Spowoduje to wyszukanie wszystkich
*.txt
plików./recup*/
, przetestowanie każdego z nichsearchPattern
, jeśli pasuje,cat
plik będzie. Dane wyjściowe wszystkichcat
plików ed zostaną skierowaneoutputfile.txt
.Powtórz dla każdego wzoru i pliku wyjściowego.
Jeśli masz bardzo dużo pasujących katalogów
./recup*
, możesz skończyć naargument list too long error
. Prostym sposobem jest zrobienie czegoś takiego:To dopasuje pełną ścieżkę. Tak
./recup01234/foo/bar.txt
będzie dopasowane.-mindepth 2
Jest tak, że nie będzie pasował./recup.txt
, albo./recup0.txt
.źródło
grep -l
), a następnie|sort|uniq
icat
z listy plików.Zamiast wypisywać wzorzec, wypisz nazwę pliku używając „-l” na grep, a następnie użyj go jako danych wejściowych do cat.
lub
Podejrzewam, że możesz wypełnić pozostałe dane. BTW, jeśli możesz mieć spacje lub inne nieparzyste znaki w nazwach plików (mało prawdopodobne w tym konkretnym przypadku, ale do przyszłych celów), użyj -print0 na znalezieniu i -Z na grep, w połączeniu z opcją -0 na xargs, aby użyć puste bajty między nazwami plików, a nie nowymi liniami.
źródło
\+
zamiast\;
tego uniknąć, ale nie wiem, jak to działa z parą argumentów -exec (podejrzewam, że „źle”). Używając pary xargów, pojawi się tylko kilka nowych procesów, które powinny być szybsze przy dużej liczbie plików.>afile
lub|acommand
czy coś jest właściwe dla danej sytuacji. :)sudo find /* -name pg_hba.conf | xargs sudo cat
sudo xargs
zamiastxargs sudo
. Po uruchomieniuxargs sudo
buduje linię poleceń, zakładając, że jest to poleceniesudo cat args
. Ale cat jest w / bin, więc sudo działa/bin/cat args
. Jeśli twoje polecenie znajduje się w dłuższym katalogu, takim jak / usr / local / bin, wówczas polecenie sudo faktycznie uruchomione może spowodować zbyt długi wiersz polecenia i błąd, który jest trudny do wyśledzenia. Poza tymsudo xargs
po prostu loguje, że uruchomiłeś xargs, axargs sudo
loguje komendę ze wszystkimi argumentami - co powoduje powstanie długich linii dziennika sudo. :)To nie jest dokładnie optymalny kod, ale jest bardzo prosty i będzie działał dobrze, jeśli wydajność nie stanowi problemu. Problem polega na tym, że wielokrotnie przeszukuje pliki, nawet jeśli łańcuch już w nich został znaleziony.
Po pierwsze, wyszukaj swoje ciągi i zapisz pasujące pliki na liście.
Powtórz ten krok, zastępując
searchPattern
w razie potrzeby. To tworzy listę pasujących plików w/tmp/file_list
.Problem polega na tym, że ten plik może mieć duplikaty. Dlatego możemy zastąpić duplikaty
|sort|uniq
.sort
Część umieszcza duplikaty przylegające do siebie, tak żeuniq
można je usunąć. Następnie możeszcat
połączyć te pliki razem za pomocąxargs
(z każdą nazwą pliku oddzieloną znakiem nowej linii\n
). W związku z tym,W przeciwieństwie do innych odpowiedzi zawiera on dwa kroki i plik tymczasowy, więc naprawdę polecam go tylko wtedy, gdy masz wiele wzorców do znalezienia.
źródło
W zależności od powłoki i środowiska możesz zrobić coś takiego (w bash)
Jeśli chcesz oddzielić wyniki według wzorca, możesz to zmienić na coś podobnego
źródło
while
Pętli odczytuje, że listy i robigrep
/ warunkowycat
udział.#!/bin/bash
, uczynić go wykonywalnym zachmod +x recoverData.sh
pomocą./recoverData.sh
. Czy nie używaćsh recoverData.sh
, ponieważ/bin/sh
jest prawdopodobne,dash
skorupa .