2010-09-07 4 views
6

Wie kann ich überprüfen, ob die Datei Binär oder Text ist, ohne die Datei zu öffnen?linux + verify, wenn Datei ist Text oder binär

+0

Es ist schwer zu sagen, ob das mit der Programmierung zusammenhängt oder ob es auf SuperUser.com migriert werden soll (ist ein bestehendes Dienstprogramm gefragt?). – Johnsyweb

+0

Text ist bestenfalls eine Teilmenge der binären, wenn nicht nur eine Interpretation. Betrachten Sie eine Ein-Byte-Datei, die '0x65' enthält. Jetzt sag mir unbedingt ob das binär oder text ist. – MSalters

+0

Was ist mit dem Kopieren der Datei vor der Überprüfung. kopieren -> öffnen -> verifizieren -> löschen –

Antwort

2

Es gibt keine Möglichkeit, sicher zu sein, ohne in die Datei zu schauen. Hoewever, Sie müssen es nicht mit einem Redakteur öffnen und sich selbst davon überzeugen, eine Ahnung zu haben. Vielleicht möchten Sie in den file Befehl schauen: http://linux.die.net/man/1/file

9

Schrödingers Katze, fürchte ich.

Es gibt keine Möglichkeit, den Inhalt einer Datei zu ermitteln, ohne sie zu öffnen. Das Dateisystem speichert keine Metadaten zu den Inhalten.

Wenn das Öffnen der Datei keine schwierige Anforderung ist, dann stehen Ihnen eine Reihe von Lösungen zur Verfügung.

Edit:

Es hat sich in einer Reihe von Kommentaren und Antworten vorgeschlagen, dass file(1) ein guter Weg, um den Inhalt zu bestimmen. Es ist wirklich. Jedoch öffnet file(1) die Datei, die in der Frage verboten wurde. Siehe die vorletzte Zeile in dem folgenden Beispiel:

> echo 'This is not a pipe' > file.jpg && strace file file.jpg 2>&1 | grep file.jpg 
execve("/usr/bin/file", ["file", "file.jpg"], [/* 56 vars */]) = 0 
lstat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0 
stat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0 
open("file.jpg", O_RDONLY|O_LARGEFILE) = 3 
write(1, "file.jpg: ASCII text\n", 21file.jpg: ASCII text 
+1

Die Unix-Befehlsdatei macht eine gute Arbeit bei der heuristischen Bestimmung des Typs – Joel

+0

@Joel: Ja, tut es. Es öffnet auch die Datei. – Johnsyweb

+1

Die Frage ist zu vage, um zu wissen, ob "offen" offen ist (2). "Offen" hat andere Konnotationen. – camh

2

Wenn Sie versuchen, diese von einem Kommando-Shell zu tun, dann wird der file Befehl eine Vermutung nehmen, was Dateityp es sich handelt. Wenn es Text ist, wird es im Allgemeinen den Worttext in seiner Beschreibung enthalten.

Mir ist keine 100% Methode bekannt, dies zu bestimmen, aber der Dateibefehl ist wahrscheinlich der genaueste.

+1

Natürlich öffnet das die Datei und wird nicht 100% sicher sein. –

+1

Tatsächlich tut es das, obwohl ich nicht sicher war, ob er es ablehnte, die Datei selbst zu öffnen oder ein Dienstprogramm zu öffnen. Ich habe festgestellt, dass es keine 100% sichere Methode gibt, dies zu tun. –

2

In Unix ist eine Datei nur einige Bytes. Also, ohne die Datei zu öffnen, können Sie nicht 100% herausfinden, es ist ASCII oder Binär.

Sie können nur Werkzeuge verwenden, die Ihnen zur Verfügung stehen, und tiefer graben, um sie narrensicher zu machen.

  1. Datei
  2. cat -v
6

Der richtige Weg, um den Typ einer Datei zu bestimmen, ist die Datei (1) Befehl zu verwenden.

Sie müssen auch beachten, dass UTF-8-kodierte Dateien "Text" -Dateien sind, aber auch Nicht-ASCII-Daten enthalten können. Andere Codierungen haben dieses Problem ebenfalls. Im Fall von Text, der mit einer code page codiert ist, kann möglicherweise nicht eindeutig festgestellt werden, ob eine Datei Text ist oder nicht.

Die Datei (1) Befehl an der Struktur einer Datei aussehen wird, um zu versuchen und zu bestimmen, was sie enthält - aus der Datei (1) man-Seite:

Die gedruckte Art in der Regel eines enthält Wörter Text (die Datei enthält nur druckbare Zeichen und ein paar gemeinsame Steuerzeichen und ist wahrscheinlich sicher auf einem ASCII-Terminal zu lesen), ausführbare (die Datei enthält das Ergebnis eines Programms in einem verständlichen Form zu einem gewissen UNIX-Kernel oder eine andere Zusammenstellung) oder Daten etwas bedeutet sonst (Daten in der Regel ist Binärdienst oder nicht druckbare).

Im Hinblick auf unterschiedliche Zeichencodierungen, wird die Datei (1) man-Seite folgende sagen:

Wenn eine Datei in der magischen Datei eine der Einträge nicht übereinstimmt, ist es überprüft, ob es sich um eine Textdatei handelt. ASCII, ISO-8859-x, nicht ISO 8-Bit erweiterte ASCII-Zeichensätze (wie die auf Macintosh und IBM PC-Systeme verwendeten), UTF-8-codierten Unicode, UTF-16-codierten Unicode, und EBCDIC-Zeichensätze können durch die verschiedenen Bereiche und Sequenzen von Bytes unterschieden werden, die in jedem Satz druckbaren Text darstellen. Wenn eine Datei einen dieser Tests besteht, wird ihr Zeichensatz gemeldet. ASCII, ISO-8859-x, UTF-8 und erweiterte ASCII-Dateien werden als 'text' identifiziert, weil sie auf fast jedem Terminal größtenteils lesbar sind; UTF-16 und EBCDIC sind nur 'Zeichendaten', da sie Text enthalten, der übersetzt werden muss, bevor er gelesen werden kann.

So wird ein Text als Text identifiziert werden, aber einige können als Zeichendaten identifiziert werden. Sie müssen selbst bestimmen, ob dies für Ihre Anwendung von Bedeutung ist und geeignete Maßnahmen ergreifen.