2011-02-10 12 views
7

Zaczynam się zastanawiać, czy jest to możliwe, ponieważ wiele wyszukiwań w SO, Google, Bing i linuxquestions.org nie przyniosło żadnych rezultatów.Jak napisać wzór testowy pliku magicznego, aby dopasować koniec pliku?

Interesuje mnie rozszerzenie magicznych wzorów znajdujących się w /usr/share/magic (używanych przez narzędzie file(1)) w celu rozpoznawania plików na podstawie danych na końcu pliku lub w jego pobliżu. Byłem w stanie zrobić to od początku pliku, jak również od arbitralnych przesunięć w pliku.

Strona podręcznika przedstawia całkiem dobrą robotę ilustrującą niektóre standardowe przypadki użycia; niestety nie wygląda na to, że istnieje sposób na indeksowanie od końca w przeciwieństwie do początku. Jedynym rozwiązaniem, które mogłem wymyślić, było przyjęcie podejścia skryptowego z użyciem tac i/lub lreverse, ale uważam, że mogą one być nieprzyjazne dla danych binarnych.

Poza tym chciałem uniknąć innego przetwarzania skryptowego - wydaje mi się, że powinno to być możliwe dzięki odpowiedniej magii plików. Jakieś pomysły?

Odpowiedz

5

To niemożliwe. file(1) jest przeznaczony również do pracy z rurami. Nie możesz użyć lseek(2) na rurach, aby dostać się do końca pliku. Czytanie całego pliku do końca będzie bardzo powolne (i file(1) stara się być szybkie) i jeśli faktycznie czyta z rury, może nigdy nie spotkać się z końcem pliku, co byłoby jeszcze gorsze.

Jeśli chodzi o dokumentację, w przypadku oprogramowania typu open source sam kod źródłowy stanowi ostateczną dokumentację. Jeśli utkniesz w takim przypadku, zawsze dobrze jest rzucić okiem. Funkcja file_or_fd() w src/magic.c daje wskazówkę. Użyj źródła, Luke! ;-)

W twoim konkretnym przypadku powinienem rzucić okiem na odpowiedni format pliku, a jeśli naprawdę nie może on być analizowany przez file(1), to krótki skrypt Perl lub Python powinien załatwić sprawę. Powodzenia!

+0

Mack, dziękuję za to jasne i zwięzłe wyjaśnienie. Nie wiem dlaczego, ale nigdy nie przyszło mi do głowy przyjrzeć się kodem źródłowym. To chyba najlepsza porada, jaką mogłem otrzymać! Jeszcze raz dziękuję, -Arj – jayce

+0

@Ari: Nie ma za co! –

Powiązane problemy