tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
797
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    chrian chrian ist offline Grünschnabel
    Registriert seit
    Oct 2010
    Beiträge
    4
    Hi,
    als erstes mal ein großes Lob an diese Community. bin hier schon Länger als Leser unterwegs und habe jetzt leider ein kleines Problem.
    Ich hoffe ihr könnt mir helfen:

    ich möchte ein Shell-Skript schreiben, das erkennt von welchem Typ eine Datei (Dateiname über Eingabeaufforderung in der Konsole) ist und eine textdatei ausgibt, bzw. eine Zip-Datei entpackt. mein Problem ist einfach, dass ich den If-Fall nicht hinbekomme.

    Danke im Voraus,
    gruß
    Christian
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hilft dir das vllt.?

    Code :
    1
    
    if [ -z "${FILE_PATH##*.gpg}" -a $FILE_PATH != ".gpg" ]; then...
     

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Für Fallunterscheidungen eignet sich meist ein case besser:
    Code bash:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    case "$FILENAME" in
    *.txt )
      echo Textdatei
      ;;
    *.zip | *.jar )
      echo Zip-Datei
      ;;
    * )
      echo unbekannte Datei
      ;;
    esac
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hallo chrian und Herzlich Willkommen als Mitglied hier bei tutorials.de

    Den Typ einer Datei erfährst du im Linux Bereich mit Hilfe des Programms "file".
    Hier mal ein Beispiel, wie du das verwenden kannst:
    Code :
    1
    2
    3
    4
    5
    
    $> file /root/textdatei 
    /root/textdatei: UTF-8 Unicode text
     
    $> file info.png 
    info.png: PNG image, 128 x 128, 8-bit/color RGBA, non-interlaced

    Das Programm geht nicht nur über die Dateiendung, sondern auch über die sogenannten "File Signature Bytes".

    Benutzereingaben liest du ja in einem Shellscript über "read" ein, hier ein kleines Beispiel:
    Code :
    1
    2
    3
    4
    
    $> read test
    servus
    $> echo $test
    servus

    Um nun herauszufinden, welchen Dateityp die Eingabe hat, kannst du die Eingabe an das Programm "file" geben und danach abfragen, was da drin steht. Da das "file" verschiedene Details bei gleichen Dateitypen ausgeben kann, würde ich dir empfehlen das Ganze zum Beispiel mit "grep" etwas zu generalisieren.

    Code bash:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #/bin/bash
     
    echo -n "Dateiname: "
    read eingabe
     
    if [ ! -e "$eingabe" ]; then
      echo "Datei existiert nicht!" >&2
      exit 1
    fi
     
    typ=$( file "$eingabe" )
    if [ ! -z "$( echo "$typ" | grep -i "text" )" ]; then
      echo "Es ist eine Textdatei."
    fi
     
    if [ ! -z "$( echo "$typ" | grep -i "png" )" ]; then
      echo "Es ist ein Bild (PNG)."
    fi
     
    exit 0

    Das für dich noch interessant "zip" liefert bei mir folgende Ausgabe:
    Code :
    1
    2
    
    $> file build.zip 
    build.zip: Zip archive data, at least v2.0 to extract

    Baue diesen Fall in mein obiges Beispiel ein, dann sollte es funktionieren.

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Wenn du nicht über die Dateiendung, sondern direkt über den Dateityp gehen willst, dann ist es meist besser (bzw. einfacher) den MIME-Type zu verwenden:
    Code bash:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    case $(file -bi "$FILENAME")
    text/*)
      echo TextDatei
      ;;
    image/png)
      echo PNG Datei
      ;;
    image/*)
      echo PNG, BMP, JPEG, GIF etc.
      ;;
    esac
    Gruß
    Bratkartoffel bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.