Was bist denn du für ein File?

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
basicwurm
Foriker
Beiträge: 48
Registriert: Di 8. Jan 2013, 16:59
Kontaktdaten:

Was bist denn du für ein File?

Beitrag von basicwurm » Sa 26. Sep 2020, 16:54

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!

gambasso
Foriker
Beiträge: 1115
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von gambasso » Sa 26. Sep 2020, 17:40

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.
Gruss

Benutzeravatar
Honsek
Foriker
Beiträge: 424
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von Honsek » So 27. Sep 2020, 08:43

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
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

Benutzeravatar
tionov
Site Admin
Beiträge: 366
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von tionov » So 27. Sep 2020, 08:56

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.
Alles Gute,

tionov

basicwurm
Foriker
Beiträge: 48
Registriert: Di 8. Jan 2013, 16:59
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von basicwurm » So 27. Sep 2020, 13:17

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 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?

gambasso
Foriker
Beiträge: 1115
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von gambasso » So 27. Sep 2020, 15:18

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 ....
Gruss

vuott
Foriker
Beiträge: 111
Registriert: Fr 16. Jan 2015, 01:27
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von vuott » So 27. Sep 2020, 15:56

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.
In praeterita spectando dolenter subfero.

Benutzeravatar
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?

Beitrag von cogier » So 27. Sep 2020, 16:47

Versuchen Sie diesen Code. Er verwendet den Befehl 'file', um die Antworten zu erhalten.
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

Benutzeravatar
tionov
Site Admin
Beiträge: 366
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von tionov » So 27. Sep 2020, 18:03

basicwurm hat geschrieben:
So 27. Sep 2020, 13:17
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?
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.
Alles Gute,

tionov

vuott
Foriker
Beiträge: 111
Registriert: Fr 16. Jan 2015, 01:27
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von vuott » So 27. Sep 2020, 23:57

tionov hat geschrieben:
So 27. Sep 2020, 18:03
Die extension ist kein sicherer Hinweis für die Art der Datei.
Genau.
In praeterita spectando dolenter subfero.

basicwurm
Foriker
Beiträge: 48
Registriert: Di 8. Jan 2013, 16:59
Kontaktdaten:

Re: Was bist denn du für ein File?

Beitrag von basicwurm » Di 29. Sep 2020, 12:15

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...

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste