Was bist denn du für ein File?
Was bist denn du für ein File?
Hallo Gambistas,
Ich soll eine App schreiben, die alle Text-Dateien (.doc, .odt, .txt usw.) in /home zusammensucht und sie irgendwo speichert.
Das Problem dabei sind Text-Dateien in Linux, die gar kein Suffix haben - wie nennt man die?
Die gb-Funktion Stat gibt als .Type nur "Regular File" an, und zwar für ein xed-File genau so wie für ein .png-Foto. Auch die bash antwortet auf stat -c %F nur: "Normale Datei". Beides kann man nicht zur Suche verwenden. Hat vielleicht jemand einen Tipp dafür?
Vielen Dank schon mal im Voraus!
Ich soll eine App schreiben, die alle Text-Dateien (.doc, .odt, .txt usw.) in /home zusammensucht und sie irgendwo speichert.
Das Problem dabei sind Text-Dateien in Linux, die gar kein Suffix haben - wie nennt man die?
Die gb-Funktion Stat gibt als .Type nur "Regular File" an, und zwar für ein xed-File genau so wie für ein .png-Foto. Auch die bash antwortet auf stat -c %F nur: "Normale Datei". Beides kann man nicht zur Suche verwenden. Hat vielleicht jemand einen Tipp dafür?
Vielen Dank schon mal im Voraus!
Re: Was bist denn du für ein File?
moin,
habe es mal mit 'FileProperties' und dem Befehl (Function) 'Stat' versucht. Klappt nicht. Aber das wußtest Du sicher schon.
Sonst fällt mir erstmal nichts dazu ein.
habe es mal mit 'FileProperties' und dem Befehl (Function) 'Stat' versucht. Klappt nicht. Aber das wußtest Du sicher schon.
Sonst fällt mir erstmal nichts dazu ein.
Gruss
Re: Was bist denn du für ein File?
Hallo,
unter diesem Link findest Du einige passende Informationen: https://www.linux-community.de/ausgaben ... -erkennen/
In der Konsole hilft
shell code
Hans
unter diesem Link findest Du einige passende Informationen: https://www.linux-community.de/ausgaben ... -erkennen/
In der Konsole hilft
shell code
hans@mint-183 ~ $ file .profile .profile: ASCII text hans@mint-183 ~ $ file hinweise hinweise: UTF-8 Unicode text, with very long lines hans@mint-183 ~/GB3BUCH/24K_NetzwerkN/24.1.2.1_Socket-Exkurs/Text $ file k24.1.2.1.odt k24.1.2.1.odt: OpenDocument Text hans@mint-183 ~/GB3BUCH/24K_NetzwerkN/24.1.2.1_Socket-Exkurs/Text $ file k24.1.2.1 k24.1.2.1: OpenDocument Text
- Die Datei .profile ist das Original.
- Bei der Datei hinweise habe ich die Extension .txt entfernt.
- Ich habe bei der ODT-Datei k24.1.2.1 die Extension entfernt.
Hans
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!
Re: Was bist denn du für ein File?
Für so was verwende ich das programm "file":
shell code
shell code
kiste # touch test.txt kiste # file -b test.txt empty kiste # echo > test.txt kiste # file -b test.txt very short file (no magic) kiste # echo mini > test.txt kiste # file -b test.txt ASCII text kiste # file -b test.docx Microsoft OOXML kiste # file -b test.odt OpenDocument Text kiste # file -b test.html HTML document, ASCII textAllerdings muss man dem eigenen Program die verschiedenen Inkarnationen dessen, was 'file' für die verschiedenen Textfiles so ausgibt, erst noch beibringen.
Alles Gute,
tionov
tionov
Re: Was bist denn du für ein File?
Vielen Dank für eure Antworten (noch dazu am Wochenende)!
Hier mein Dialog mit der bash:
shell code
Alle Files mit Extension sind ja kein Problem; ich fasse sie in einem Array zusammen und
durchsuche dieses dann, z.B. um alle Files mit Texten zu finden:
shell code
Hier mein Dialog mit der bash:
shell code
> nano linux # File erzeugen > file --extension linux linux: ??? > file linux linux: ASCII textLeider kann ich weder "???" noch "ASCI text" für meine Suche nach Linux-Files verwenden.
Alle Files mit Extension sind ja kein Problem; ich fasse sie in einem Array zusammen und
durchsuche dieses dann, z.B. um alle Files mit Texten zu finden:
shell code
arrtext = [".csv", ".doc", ".docx", ".htm", ".html", ".odt", ".ods", ".odp", ".pdf", ".rtf", ".txt", ".xls", ".xlsx"]Die Frage ist: Was schreibe ich in dieses Array, um auch ein Linux-Textfile ohne Extension zu finden?
Re: Was bist denn du für ein File?
moin,
meiner Meinung nach ist es nicht möglich, denn jeder kann doch die Extension eines Files benennen wie er will.
Du kannst zwar filtern mit Deinem 'arrtext', diese dann direkt weiterverarbeiten, aber die anderen File ohne Extension?
Ich habe es mal zum Testen so gemacht, das File in eine 'Variant'-Variable eingelesen und dann Byte für Byte mit dem Zeichensatz
verglichen. Dabei dann die nicht darstellbaren, gewünschten Zeichen durch irgend ein anderes Zeichen ersetzt oder weggelassen und nur die gewünschten Zeichen übernommen. Denke an die nicht darstellbaren Zeichen wie z.B. 'CHR(10)' usw.
Ich weiss nicht was Du erreichen möchtest, das kann man bis zum Exzes treiben.
Ich habe mir mal die Mühe gemacht, jeden Sektor einer Festplatte auslesen zu können. Hat auch wunderbar geklappt, Aber ....
meiner Meinung nach ist es nicht möglich, denn jeder kann doch die Extension eines Files benennen wie er will.
Du kannst zwar filtern mit Deinem 'arrtext', diese dann direkt weiterverarbeiten, aber die anderen File ohne Extension?
Ich habe es mal zum Testen so gemacht, das File in eine 'Variant'-Variable eingelesen und dann Byte für Byte mit dem Zeichensatz
verglichen. Dabei dann die nicht darstellbaren, gewünschten Zeichen durch irgend ein anderes Zeichen ersetzt oder weggelassen und nur die gewünschten Zeichen übernommen. Denke an die nicht darstellbaren Zeichen wie z.B. 'CHR(10)' usw.
Ich weiss nicht was Du erreichen möchtest, das kann man bis zum Exzes treiben.
Ich habe mir mal die Mühe gemacht, jeden Sektor einer Festplatte auslesen zu können. Hat auch wunderbar geklappt, Aber ....
Gruss
Re: Was bist denn du für ein File?
Ich nehme an, Sie meinen Dateien mit reinen Textwerten.
In diesem Fall können Sie anhand der Gambasso-Idee prüfen, ob es einen oder mehrere Werte - wie Indikatoren gibt (z. B. null, &h00) - die keine Textsymbole sind.
Man muss nur auf die Werte achten, die nützlich sind, um bestimmte Buchstaben im deutschen Alphabet zu erzeugen, aber sie gehören nicht zum englischen Alphabet.
Wenn es nur Werte aus dem Alphabet, den Zahlen und anderen Symbolen gibt, die normalerweise in einem Text verwendet werden, dann bedeutet das, dass es sich um eine Textdatei handelt.
Außerdem ist, wie gambasso bereits sagte, eine Linux-Textdatei am Ende immer ein &h0A-Wert.
Das ist ein wichtiger Indikator.
In praeterita spectando dolenter subfero.
- cogier
- Foriker
- Beiträge: 57
- Registriert: Do 19. Jul 2018, 16:18
- Wohnort: Guernsey, Channel Islands
- Kontaktdaten:
Re: Was bist denn du für ein File?
Versuchen Sie diesen Code. Er verwendet den Befehl 'file', um die Antworten zu erhalten.
gambas code
gambas code
Gridview1 As Gridview Public Sub Form_Open() Setup Display End Public Sub Display() Dim sPath As String = User.Home Dim sDir As String[] = Dir(sPath) Dim iLoop As Integer Dim sResult As String For iLoop = 0 To sDir.Max Inc GridView1.Rows.Count Shell "file '" & sPath &/ sDir[iLoop] & "'" To sResult sResult = Left(sResult, -1) GridView1[iloop, 0].Text = Split(sResult, ":")[0] GridView1[iloop, 1].Text = Split(sResult, ":")[1] Next GridView1.Columns.Width = -1 End Public Sub Setup() With Me .h = 700 .w = 1150 .Padding = 5 .Arrangement = Arrange.Vertical End With With Gridview1 = New GridView(Me) As "Gridview1" .Expand = True .Rows.Count = 0 .Columns.Count = 2 End With End
Re: Was bist denn du für ein File?
Die extension ist kein sicherer Hinweis für die Art der Datei. 'file -b -e elf $datei' liefert einen String nach dem die Datei klassifiziert werden kann. Eine Software von mir fragt bei einem ihr unbekannten String nach, was es ist und gibt dem Benutzer Vorschläge, wie die Datei zu klassifizieren ist, z.B:
Text, Bild, Pdf, Sound etc.
Und wenn das Ganze eine Weile lief, dann kommt so was raus:
shell code
filetype | typ ---------------------------------------------------------------------------+---------- raw G3 data, byte-padded | Image raw G3 data | Image RIFF (little-endian) data, WAVE audio, Microsoft PCM, 8 bit, mono 8000 Hz | Sound Ogg data, Vorbis audio, mono, 8000 Hz, ~25200 bps | Sound Ogg data, Vorbis audio, mono, 11025 Hz, ~32000 bps | Sound PDF document, version 1.4 | Pdf image/tiff; charset=binary | Image image/png; charset=binary | Image RIFF (little-endian) data | Sound PDF document | Pdf Ogg data | Sound TIFF image data | Image PNG image data | Image UTF-8 Unicode text | Txt Zip archive data | Pack data | Data JPEG image data | Image raw G3 (Group 3) Fax | Image ASCII text | Txt XML 1.0 document | XML HTML document | HTMLJede angelernte Dokumentklasse kann damit in Zukunft automatisch zugeordnet werden. Wenn eine Datei einer unbekannten Klasse gefunden wird, fragt die Software nach, was es ist.
Ich weiß, das hilft dir jetzt nicht groß weiter, ist aber vielleicht ein Ansatz. Du könntest viele unterschiedliche Textdokumente sammeln und eine Software schreiben, die mittels 'file' die Strings sammelt, die die Dokumente klassifizieren. Also quasi an Beispielen lernt und dann das Gelernte verwendet, um Dateien zu klassifizieren.
Alles Gute,
tionov
tionov
Re: Was bist denn du für ein File?
Vielen Dank nochmals für eure Antworten!
Hier das Ergebnis meiner Forschungen:
1. Die funktion "file" ist wirklich das einzige Instrument, um Linux-Files zu finden. Die haben (zumindest in unseren Familiencomputern) immer Text als Inhalt. Es sind auch nicht viele, weil ich alle .files ausschließe, aber es ist wichtig, dass sie mit den anderen Textfiles gespeichert werden.
2. "file" antwortet nicht bei allen Linux-files gleich: Bei kurzem Inhalt nur mit "ASCII-Text",
bei mehr Text mit "UTF-8 Unicode text" oder mit "UTF-8 Unicode text with very long lines". Immerhin enthalten alle Antworten das Wort "text" und so kann ich mit der gb-Funktion InStr doch alle Textfiles herausfischen.
3. Da mein Code nun außer den Suffixen im Texte-Array auch noch die Shell-Funktion "file" abarbeiten muss, wird die App deutlich mehr Arbeitszeit brauchen. Ich könnte mir das ersparen, wenn ich gewohnheitsmäßig alle Linux-Files mit einem ".txt" -Suffix versehen würde; die könnten dann auch gleich auf Win-Systemen gelesen werden.
@tionov: Es stimmt schon, dass extension und Inhalt nicht immer übereinstimmen - wenn ich von einer
Buchseite einen Screenshot mache, erhalte ich ein .png-File mit Text-Inhalt. Man kann halt nicht alles haben...
Hier das Ergebnis meiner Forschungen:
1. Die funktion "file" ist wirklich das einzige Instrument, um Linux-Files zu finden. Die haben (zumindest in unseren Familiencomputern) immer Text als Inhalt. Es sind auch nicht viele, weil ich alle .files ausschließe, aber es ist wichtig, dass sie mit den anderen Textfiles gespeichert werden.
2. "file" antwortet nicht bei allen Linux-files gleich: Bei kurzem Inhalt nur mit "ASCII-Text",
bei mehr Text mit "UTF-8 Unicode text" oder mit "UTF-8 Unicode text with very long lines". Immerhin enthalten alle Antworten das Wort "text" und so kann ich mit der gb-Funktion InStr doch alle Textfiles herausfischen.
3. Da mein Code nun außer den Suffixen im Texte-Array auch noch die Shell-Funktion "file" abarbeiten muss, wird die App deutlich mehr Arbeitszeit brauchen. Ich könnte mir das ersparen, wenn ich gewohnheitsmäßig alle Linux-Files mit einem ".txt" -Suffix versehen würde; die könnten dann auch gleich auf Win-Systemen gelesen werden.
@tionov: Es stimmt schon, dass extension und Inhalt nicht immer übereinstimmen - wenn ich von einer
Buchseite einen Screenshot mache, erhalte ich ein .png-File mit Text-Inhalt. Man kann halt nicht alles haben...
Wer ist online?
Mitglieder in diesem Forum: Bing [Bot], consolefetischist und 2 Gäste