• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

in shellskript mit file überprüfen ,ob es Textdateiist[gelös

intergo

Member
Hallo bin erneut am Fragen, wollte wissen, wie soll man mit file überprüfen, ob die Datei eine Textdatei ist?

Genauer gesagt, soll ich überpüfen ob es eine Textdatei ist d.h. auf endung der Datei.
Danke
 

P6CNAT

Advanced Hacker
Hi intergeo,

klar, es werden sogar die verschiedenen Arten der Codierung wiedergegeben.

Code:
$ file Test.txt
Test.txt: ISO-8859 text, with CRLF line terminators
$ file Test2.txt
Test2.txt: UTF-8 Unicode English text, with very long lines

Aber wenn du nur nach Endungen schaust, kannst du doch auch mit
Code:
ls *.txt
oder
Code:
find . -name "*.txt"
suchen.

Gruß
Georg
 
A

Anonymous

Gast
intergo schrieb:
Hallo bin erneut am Fragen, wollte wissen, wie soll man mit file überprüfen, ob die Datei eine Textdatei ist?

Genauer gesagt, soll ich überpüfen ob es eine Textdatei ist d.h. auf endung der Datei.
Danke

Diese Fragestellung ist etwas irreführend. In Linux ist die Endung einer Datei für viele Dateitypen überhaupt nicht maßgeblich, und Textdateien haben von Hause aus laut Definition schon die unterschiedlichsten Endungen. Welche Datei mit sehr hoher Wahrscheinlichkeit "lesbaren text" enthält, kannst du mit file wie folgt prüfen. (hier angewendet auf alle Dateien des aktuellen Verzeichnisses.)
Code:
file  * | awk -F":" '$2~"text"{print $1}'

Wenn du nach speziellen Textdateien suchst zB C-Quelltextdateien dann
Code:
file -iN * | awk -F":" '$2 ~ "text/x-c" {print $1}'
Das ist aber nicht mehr ganz so genau, da C-Quellcode ebenso als LISP als PASCAL oder C++ eventuell auch noch FORTRAN mittels "file" erkannt werden könnte. Je nach dem wie sauber der Code insbesondere am Dateianfang geschrieben wird, kann es da durchaus schon mal Ungenauigkeiten geben.

Anstatt awk kannst du genauso gut auch mit grep und vorher eventuell noch mit cut die Ausgabe von file durchsuchen
Bei einem test auf eine einzelne Datei könnte das so hier aussehen
Code:
if file -N  DATEI |  cut -d: -f2  | grep "text" >/dev/null ; then  echo  "ist text"; else  echo "kein text"; fi

robi
 
OP
I

intergo

Member
Stimmt, ich beschreib es mal genauer.
Alos ich soll ein skript schreiben, dass Dateien mit dem kommando file untersucht werden sollen ,ob dies eine textdatei ist odernicht.
Genauergesagt wird in der eingabe der Dateiname einer Datei eingegeben , die exisiteirt und bevor er die Zeilen zählt, soll überprüft werden, ob es eine Textdatei ist.
Falls es keine ist, wird das skript beendet.
Falls es eine ist, sollen die zeilen in dieser Datei gezählt werden.
 
OP
I

intergo

Member
habe es ausprobiert, nur wenn ich eine c- Datei eingebe, erkennt er es auch als Textdatei an.
Eine C-Datei ist doch nicht das Gleiche wie eine txt oder tex-Datei?

Oder wrd es von linux auch als Textdatei angesehen?

Danke nochmal
 
OP
I

intergo

Member
Code:
#! /bin/bash
#set -x

#realisiert wc Befehl


datzahler=0

while true
do




echo " 1 für Anzahl der Zeichen "
echo " 2 für ANzahl der Woerter "
echo " 3 für Anzahl der Zeilen "

echo -n " Was soll gezaehlt werden "
read antwort



case  $antwort in 


1) echo "Welche datei soll gezeahlt werden"
   echo "Bitte Datei eingeben"
read name1
file   $name1
if ( test  find . -name "*.txt" )

then
zeichen=`cat $name1 | wc -c`
echo "Die Anzahl der Zeichen in Datei $name1 betreagt :$zeichen"

else

echo "Ist keine Textdatei"
let datzahler=$datzahler+1
echo "Es wurden $datzahler Dateien gezeahlt"
exit
 
fi;;

2) echo "Welche Datei soll gezeahlt werden?"
   echo "Bitte Datei eingeben"
    read name2
    file   $name2
      if [ -f $name2 ]
	  then
	woerter=`cat $name | wc -w`
	echo "Die Anzahl der Woerter betreagt : $woerter"

	else
	echo "Es ist keine Textdatei"
	let datzahler=$datzahler+1
	echo "Es wurden $datzahler Dateien gezeahlt"

fi;;



3) echo "Welche Datei soll gezeahlt werden?"
   echo "Bitte eingeben"
    read name3
    file -i  $name3
    if [ -f $name3 ]
	then
      zeilen=` cat $name3 | wc -l`
      echo "Es wurden $zeilen Zeilen in Datei $name3 gezaehlt"
      

      else
      echo "Es ist keine datei"
      let datzahler= $datzahler+1
      echo "Es wurden $datzahler gezaehlt"

fi;;

*) echo "Skript wird beendet" 
exit;; 



esac

done

[/code
Das ist wie ich es geschrieben habe, doch er zählt mir trotzdem die c dateien und bei der eingabe von einer textdastei, sagt er es ist keine textdatei.
 
A

Anonymous

Gast
intergo schrieb:
habe es ausprobiert, nur wenn ich eine c- Datei eingebe, erkennt er es auch als Textdatei an.
Eine C-Datei ist doch nicht das Gleiche wie eine txt oder tex-Datei?

Oder wrd es von linux auch als Textdatei angesehen?

http://de.wikipedia.org/wiki/Textdatei

deren Inhalt aus einer sequentiellen Folge von darstellbaren Zeichen eines Zeichensatzes besteht, die durch Steuerzeichen wie Zeilen- und Seitenwechsel untergliedert sein kann
Was den Inhalt ausmacht ist damit nicht definiert, das kann eine Logdatei, ein Shellscript, eine Konfigurationsdatei, eine html-Datei, ein Brief im Rohformat, ein in irgend einer Programmierspache geschriebener Programmcode , eine Tabelle in Textformat oder auch nur eine Sammlung von irgendwelchen Worten sein oder tausende Sachen mehr. Für dich von Interesse ist das es keine Binärzeichen hat, einen einheitlichen Zeichensatz verwendet und eventuell noch Zeilen hat. also sollte es eine bei file "text" anzeigen und wenn du ganz streng sein willst, sollte es nicht folgende Ausgabe bei "file" enthalten, oder bei "wc -l" nicht 0 anzeigen.
with very long lines, with no line terminators

robi
 

Tooltime

Advanced Hacker
Bei mir wird der Datentyp der Textdateien unterschieden, openSUSE 11.3. Was für ein Unix benutzt du denn?
Code:
tooltime@athlon:~> file -b --mime-type /usr/include/stdio.h
text/x-c
tooltime@athlon:~> file -b --mime-type /usr/include/c++/4.5/iostream
text/x-c++
tooltime@athlon:~> file -b --mime-type /etc/fstab
text/plain
tooltime@athlon:~>

PS:
Bei der Darstellung von deinen Script fehlt beim schließenden Code-Tag eine eckige Klammer, korrigiere das bitte mal.
 
A

Anonymous

Gast
intergo schrieb:
doch er zählt mir trotzdem die c dateien und bei der eingabe von einer textdastei, sagt er es ist keine textdatei.

erst mal müsstest du dir klar werden was du hier überhaupt machen willst
Code:
if ( test find . -name "*.txt" )
an dieser Zeile ist alles falsch.

robi
 
OP
I

intergo

Member
Code:
#! /bin/bash
#set -x

#realisiert wc Befehl


datzahler=0

while true
do




echo " 1 für Anzahl der Zeichen "
echo " 2 für ANzahl der Woerter "
echo " 3 für Anzahl der Zeilen "

echo -n " Was soll gezaehlt werden "
read antwort



case $antwort in


1) echo "Welche datei soll gezeahlt werden"
echo "Bitte Datei eingeben"
read name1
file $name1
if ( test find . -name "*.txt" )

then
zeichen=`cat $name1 | wc -c`
echo "Die Anzahl der Zeichen in Datei $name1 betreagt :$zeichen"

else

echo "Ist keine Textdatei"
let datzahler=$datzahler+1
echo "Es wurden $datzahler Dateien gezeahlt"
exit

fi;;

2) echo "Welche Datei soll gezeahlt werden?"
echo "Bitte Datei eingeben"
read name2
file $name2
if [ -f $name2 ]
then
woerter=`cat $name | wc -w`
echo "Die Anzahl der Woerter betreagt : $woerter"

else
echo "Es ist keine Textdatei"
let datzahler=$datzahler+1
echo "Es wurden $datzahler Dateien gezeahlt"

fi;;



3) echo "Welche Datei soll gezeahlt werden?"
echo "Bitte eingeben"
read name3
file -i $name3
if [ -f $name3 ]
then
zeilen=` cat $name3 | wc -l`
echo "Es wurden $zeilen Zeilen in Datei $name3 gezaehlt"


else
echo "Es ist keine datei"
let datzahler= $datzahler+1
echo "Es wurden $datzahler gezaehlt"



fi;;

*) echo "Skript wird beendet"
exit;;



esac

done
 
OP
I

intergo

Member
Stimmt schon, ich wollte eigentlich in der if -Abfrage die bedinunhg setzen, das wenn es eine Textdatei ist, dass er mir die Wörter zählt ,doch wenn er nicht der fall ist, soll er das else ausführen.

Nur das funktioniert nicht bzw. ich komm nicht drauf
 

framp

Moderator
Teammitglied
Wenn Du Einrückungen benutzen würdest könnte man die Logik Deines Codes wesentlich leichter verstehen :roll:
 
OP
I

intergo

Member
Code:
#! /bin/bash
#set -x

#realisiert wc Befehl


datzahler=0

while true
   do




        echo " 1 für Anzahl der Zeichen "
        echo " 2 für ANzahl der Woerter "
        echo " 3 für Anzahl der Zeilen "

        echo -n " Was soll gezaehlt werden "
        read antwort



case $antwort in


        1) echo "Welche datei soll gezeahlt werden"
         echo "Bitte Datei eingeben"
         read name1
         file $name1
   if ( test find . -name "*.txt" )

       then
          zeichen=`cat $name1 | wc -c`
          echo "Die Anzahl der Zeichen in Datei $name1 betreagt :$zeichen"
 
        else

          echo "Ist keine Textdatei"
          let datzahler=$datzahler+1
          echo "Es wurden $datzahler Dateien gezeahlt"
        exit

fi;;

        2) echo "Welche Datei soll gezeahlt werden?"
            echo "Bitte Datei eingeben"
            read name2
            file $name2
if [ -f $name2 ]
          then 
             woerter=`cat $name | wc -w`
             echo "Die Anzahl der Woerter betreagt : $woerter"

           else
               echo "Es ist keine Textdatei"
               let datzahler=$datzahler+1
               echo "Es wurden $datzahler Dateien gezeahlt"

fi;;



         3) echo "Welche Datei soll gezeahlt werden?"
             echo "Bitte eingeben"
             read name3
             file  $name3
if [ -f $name3 ]
          then
              zeilen=` cat $name3 | wc -l`
              echo "Es wurden $zeilen Zeilen in Datei $name3 gezaehlt"


           else
               echo "Es ist keine datei"
               let datzahler= $datzahler+1
               echo "Es wurden $datzahler gezaehlt"

fi;;

         *) echo "Skript wird beendet"
             exit;;



esac

done
 
OP
I

intergo

Member
ok heißt es mit mimetype($file) gibt er mir ne bestimmte codeirung , ob es eine Textdatei sit?

oder verstehe ich es falsch???
 
A

Anonymous

Gast
abgdf schrieb:
Oft braucht man dafür Magie ... ;)
@abgdf : ist hier kontraproduktiv wir sind noch am erlernen der Grundlagen der Shellprogrammierung. Und da haben wir "file" und bauchen keine magic-Schnittstellen für Perl oder was auch immer.

--------------
intergo schrieb:
ok heißt es mit mimetype($file) gibt er mir ne bestimmte codeirung , ob es eine Textdatei sit?
oder verstehe ich es falsch???

vergiss das, auf Shellebene währe das "file -i Datei"
Welche mimetype dein "file" erkennt würdest du folgend finden
Code:
grep '^!:mime' /usr/share/misc/magic | sort | uniq
(Diese List ist aber im Bezug auf die Texttypen nicht vollständig, da einige fest einprogammiert sind und desshalb nicht aus der Konfigurationsdatei herausgelesen werden können.)
brauchst du aber alles nicht, "file" ohne Option zeigt dir in der Ausgabe durch das Wort "text" mit 98% Sicherheit das es sich um eine Textdatei handelt. Definition Textdatei siehe oben Link zu Wikipedia

robi
 
OP
I

intergo

Member
OK danke robi, d.h. mir file -i könnte ich es hinbekommen und dies evebtuell in meine if abfrage integrieren , damit wenn es keine tectdatei ist, das er nichts zählt.
Ich versuch es mal und poste dann mal mein code rein
 
OP
I

intergo

Member
Ok ,also ich hab jetzt es mit dem file -i versucht ,dich mein problem ist zu programmieren,d.h. wie sage ich in der if abfrage, dass wenn es keine Textdatei sit, dass er nicht zählen muss.?
 
Oben