Seite 1 von 1
Was bist denn du für ein File?
Verfasst: Sa 26. Sep 2020, 16:54
von basicwurm
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!
Re: Was bist denn du für ein File?
Verfasst: Sa 26. Sep 2020, 17:40
von gambasso
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.
Re: Was bist denn du für ein File?
Verfasst: So 27. Sep 2020, 08:43
von Honsek
Hallo,
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.
Mit freundlichen Grüßen
Hans
Re: Was bist denn du für ein File?
Verfasst: So 27. Sep 2020, 08:56
von tionov
Für so was verwende ich das programm "file":
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 text
Allerdings muss man dem eigenen Program die verschiedenen Inkarnationen dessen, was 'file' für die verschiedenen Textfiles so ausgibt, erst noch beibringen.
Re: Was bist denn du für ein File?
Verfasst: So 27. Sep 2020, 13:17
von basicwurm
Vielen Dank für eure Antworten (noch dazu am Wochenende)!
Hier mein Dialog mit der bash:
shell code> nano linux # File erzeugen
> file --extension linux
linux: ???
> file linux
linux: ASCII text
Leider 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 codearrtext = [".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?
Verfasst: So 27. Sep 2020, 15:18
von gambasso
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 ....
Re: Was bist denn du für ein File?
Verfasst: So 27. Sep 2020, 15:56
von vuott
basicwurm hat geschrieben: ↑So 27. Sep 2020, 13:17
Die Frage ist: Was schreibe ich in dieses Array, um auch ein Linux-Textfile
ohne Extension zu finden?
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.
Re: Was bist denn du für ein File?
Verfasst: So 27. Sep 2020, 16:47
von cogier
Versuchen Sie diesen Code. Er verwendet den Befehl 'file', um die Antworten zu erhalten.
gambas codeGridview1 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?
Verfasst: So 27. Sep 2020, 18:03
von tionov
basicwurm hat geschrieben: ↑So 27. Sep 2020, 13:17
shell codearrtext = [".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?
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 | HTML
Jede 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.
Re: Was bist denn du für ein File?
Verfasst: So 27. Sep 2020, 23:57
von vuott
tionov hat geschrieben: ↑So 27. Sep 2020, 18:03
Die extension ist kein sicherer Hinweis für die Art der Datei.
Genau.
Re: Was bist denn du für ein File?
Verfasst: Di 29. Sep 2020, 12:15
von basicwurm
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...