Dateiendungen finden

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Marc2468, 26.09.2006.

  1. #1 Marc2468, 26.09.2006
    Marc2468

    Marc2468 Grünschnabel

    Dabei seit:
    26.09.2006
    Beiträge:
    9
    Zustimmungen:
    0
    Hallo,
    ich habe schon ab und an in diesem Forum Hilfe gefunden, wenn ich in der shell nicht weiter gekommen bin.
    Jetzt schreib ich das erste mal selbst eine Frage hier rein.

    Einleitung:
    Ich möchte bei einem Skript, dass für mich dateien sortiert, noch bei jeder Datei eine if schleife anhängen, die mir ausgibt, ob eine Datei mit der Endung z.B.: .jpg vorhanden ist.

    Meine eigentliche Frage:
    Hier ist die stelle des Skripts um die es geht:

    #!/bin/bash
    if test -e /Users/marc/Desktop/test/*.jpg
    then
    echo "Dateiart .jpg vorhanden"
    else
    echo "Dateiart .jpg nicht vorhanden"
    fi

    Das Skript funktioniert auch richtig, solange entwerder nur ein .jpg oder keines in dem Ordner liegt.
    Wie kann ich diese Schleife nun aber so ändern, dass sie mir auch wenn z.B.: 10 .jpg Dateien in dem Ordner liegen ausgibt: Dateiart .jpg vorhanden?

    Ich würde mich über eine Antwort sehr freuen.
    Vielen Dank.
    Marc.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 26.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Gegengfrage:
    Willst du jede vorhandene Datei quittiert haben, oder nur wissen ob in dem Verzeichnis mindestens eine Datei mit der Endung jpg vorkommt?

    Um eine Schleife zu basteln, die dir alle Dateien in irgendeiner Form prüft, kannst du die Expansion der Shell verwenden:
    Code:
    X=0;
    for I in "*jpg";
    do
    ((x++));
    done
    if [  $X -gt 0 ];
    then
    echo "Es wurden $X Dateien mit der Endung jpg gefunden";
    else
    echo "Keine Datei mit der Endung jpg gefunden"
    fi
    
    Das ist nur ein simples Beispiel, was hier nicht case-sensitiv arbeitet.
    Hier wird die Anzahl mit ausgegeben.
    Wenn es dir genügt, dass eine einzige Datei mit der Endung vorkommt, kannst du das auch ohne zählen machen und die Schleife sofort verlassen. (break)

    HTH
    Gruß Wolfgang
     
  4. #3 Marc2468, 26.09.2006
    Marc2468

    Marc2468 Grünschnabel

    Dabei seit:
    26.09.2006
    Beiträge:
    9
    Zustimmungen:
    0
    Hallo Wolfgang,
    danke für die Reaktion.
    Ich habe hier noch mal angehängt, wie ich das auf meine momentane Testumgebung angepasst habe. Ich hab auch schon einige Varianten versucht, z.B.: vorher mit ch /Users/marc/Desktop/test/ zum Pfad zu wechseln, um das jpg wie bei Dir abgebildet stehen zu lassen.
    Leider funktioniert es egal wie ich es versucht habe nicht, es kommt immer die Ausgabe: Keine Datei mit der Endung .jpg gefunden,
    obwohl in dem testordner eine .jpg Datei liegt.
    Was mach ich falsch?! :-(

    #!/bin/sh
    X=0;
    for I in "/Users/marc/Desktop/test/*jpg";
    do
    ((x++));
    done
    if [ $X -gt 0 ];
    then
    echo "Es wurden $X Dateien mit der Endung .jpg gefunden";
    else
    echo "Keine Datei mit der Endung .jpg gefunden"
    fi

    Ich würde mich über eine weitere Antwort freuen! :-)
    Danke schon mal.
    Gruß Marc.
     
  5. #4 Wolfgang, 26.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Was gibt denn das aus?
    Code:
    for I in "/Users/marc/Desktop/test/*jpg";
    do
    echo $I;
    done
    
    Eventuell möchtest du gleich find benutzen, dann erübrigt sich auch das Case-Sensitive.
    Code:
    for i in $(find /path/to/files -iname "*jpg");
    do
    echo $i; #Echo nur zur Kontrolle
    ((x++));...
    #wie oben
    
    Gruß Wolfgang
     
  6. #5 root1992, 26.09.2006
    root1992

    root1992 von IT-Lehrern besessen

    Dabei seit:
    02.01.2006
    Beiträge:
    1.138
    Zustimmungen:
    0
    Ort:
    Märchenwald
    So wie ich sehe, willst du die Dateiendungen haben. Wenn du z.B. eine List mit den Dateinamen hast(ls -1) und die ausgabe so aussieht:
    Code:
    test.sh
    test.jpg
    bild.bmp
    textdate.txt
    dann soll die ausgabe so aussehen:
    Code:
    sh
    jpg
    bmp
    txt
    Da würde ich so vorgehen:
    Code:
    #! /bin/sh
    
    for i in $(ls -1)  #liste mit den Dateien im aktuellen Verzeichnis
    do
    endung=$(echo "$i" | cut -d . -f 2 ) #cut: setze Feldtrenner . und lasse den 2.teil ausgeben
    echo $endung
    done
    
    Einziges Problem: Dateien ohne Endung. Z.B. gibt das SH für die Datei "test.txt" "txt" aus, passt ja, aber für die Datei "test" gibt es "test" aus.
     
  7. Lumpi

    Lumpi Haudegen

    Dabei seit:
    14.06.2006
    Beiträge:
    663
    Zustimmungen:
    0
    Ort:
    Dessau
    Hallo,

    Da Marc2468 dem Beispiel von Wolfgang folgt, glaub ich das kaum. :D

    @Marc2468:
    Dein Problem ist das case sensitive, da (z.B. bei meiner Kamera)
    viele *jpg - Dateien in linux *JPG - Dateien sind.....
    Gruß Lumpi
     
  8. #7 Wolfgang, 26.09.2006
    Zuletzt bearbeitet: 26.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Wenn du nur den Teil nach dem letzten Punkt willst (was hier nicht gefragt ist), dann ist der Ansatz weit unkomplizierter.
    Code:
    
    $ A="ein.file.txt"; echo ${A##*\.}
    txt
    
    Da braucht es kein cut.
    Dateien ohne Punkt kannst du ja vorher aussortieren.

    Gruß Wolfgang
     
  9. #8 SkydiverBS, 27.09.2006
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    Hallo!

    Also ich denke es liegt an einem Typo im Skript.
    Code:
    #!/bin/sh
    X=0;
    for I in "/Users/marc/Desktop/test/*jpg";
    do
    ((x++));
    done
    if [ $X -gt 0 ];
    then
    echo "Es wurden $X Dateien mit der Endung .jpg gefunden";
    else
    echo "Keine Datei mit der Endung .jpg gefunden"
    fi
    Das x in der fünften Zeile muß auch groß geschrieben werden!

    Unter Verwendung der find-Methode müsste das dann so aussehen:
    Code:
    #!/bin/sh
    X=0;
    for I in $(find /Users/marc/Desktop/test -iname "*.jpg");
    do
    ((X++));
    done
    if [ $X -gt 0 ];
    then
    echo "Es wurden $X Dateien mit der Endung .jpg gefunden";
    else
    echo "Keine Datei mit der Endung .jpg gefunden"
    fi
    Gruß,
    Philip
     
  10. #9 Marc2468, 27.09.2006
    Marc2468

    Marc2468 Grünschnabel

    Dabei seit:
    26.09.2006
    Beiträge:
    9
    Zustimmungen:
    0
    @root1992 & Lumpi: Erst mal danke für die Vorschläge, aber wie Lumpi richtig erkannt hat, wollte ich auf das was Wolfgang beschrieben hat hinaus.

    @Wolfgang: Der "find" Vorschlag funktioniert, ... nur ein Fehler tritt noch auf, wenn der Ordner keine Datei der gesuchten Art enthält, kommt einen Fehlermeltung, zwar gefolgt von der Richtigen Ausgabe, aber ich konnte auch nicht rausfinden, weshlb der Fehler eigentlich kommt.
    Denn er verweist auf Zeile 7 wo die if Schleife steht die meiner Meinung aber einfach regulär die else Ausgabe ausführen müsste, ... ohne Fehler.

    Erst mal das neue Skript:
    Code:
    #!/bin/sh
    X=0
    for i in $(find /Users/marc/Desktop/test/ -iname "*jpg");
    do
    ((x++));
    done
    if [  $x -gt 0 ];
    then
    echo "Es wurden $x Dateien mit der Endung .jpg gefunden";
    else
    echo "Keine Datei mit der Endung .jpg gefunden"
    fi
    
    Ausgabe mit einer entsprechenden Datei enthalten:
    Code:
    Marc-Mac:~ marc$ /Users/marc/Desktop/find.sh; exit
    Es wurden 1 Dateien mit der Endung .jpg gefunden
    logout
    [Prozess beendet]
    
    Ausgabe bei leerem Testordner:
    Code:
    Marc-Mac:~ marc$ /Users/marc/Desktop/find.sh; exit
    /Users/marc/Desktop/find.sh: line 7: [: -gt: unary operator expected
    Keine Datei mit der Endung .jpg gefunden
    logout
    [Prozess beendet]
    
    Würde es toll finden, wenn es dafür noch ne Lösung gibt.
    Ansonsten schon mal vielen Danke, Du hast mir echt schon sehr geholfen!
    Ich denke nicht, dass ich ohne Deine Hilfestellung den Ansatz gefunden hätte.
    Gruß Marc.
     
  11. #10 Marc2468, 27.09.2006
    Marc2468

    Marc2468 Grünschnabel

    Dabei seit:
    26.09.2006
    Beiträge:
    9
    Zustimmungen:
    0
    @SkydiverBS: Danke das hatte ich übersehen, das erste X beim deklarieren war noch groß geschrieben, deswegen war die null nicht vorgegeben ...

    Danke noch mal an alle die mir hier geholfen haben!
    Und besonders an Wolfgang und SkydiverBS!
    Genau das wollte ich. :D

    Gruß Marc.
     
  12. #11 SkydiverBS, 27.09.2006
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    Super :) !

    Eine Anmerkung noch:
    Code:
    find /Users/marc/Desktop/test/ -iname "*jpg"
    Dieser find-Aufruf aus deinem Skript findet auch Dateien die auf "jpg" enden aber keine Dateiendung haben, wie z.B. "dies_ist_kein_jpg". Wenn du das nicht willst musst du noch einen Punkt vor das "jpg" schreiben:
    Code:
    find /Users/marc/Desktop/test/ -iname "*.jpg"
    Hab hier übrigens gerade bei einer Google-Suche eine Seite gefunden, die die Fehlermeldung die dein Skript erzeugt hat sehr anschaulich erklärt. So genau wusste ich auch noch nicht wie die Zustande kommt :) ! Schauts euch mal an: http://www.linuxcommand.org/wss0100.php

    Gruß,
    Philip
     
  13. Lumpi

    Lumpi Haudegen

    Dabei seit:
    14.06.2006
    Beiträge:
    663
    Zustimmungen:
    0
    Ort:
    Dessau
    Hallo,

    Super das es nun läuft :)
    Aber lese doch noch mal Hier (Punkt 2.3) :devil:

    Gruß Lumpi
     
  14. #13 Wolfgang, 27.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Ich bin heute etwas daneben, was meine Tippfehler betrifft.
    Zu dem Fehler hatte ich unlängst schonmal hier im Board etwas gesagt, finde es nur gerade nicht.
    Stichwort Quoting!
    Wenn man bei find ganz sicher gehen will, sollte im -name der . (Punkt) maskiert werden.

    Allerdings gehe ich davon aus, dass nicht einfach ein Codefetzen von mir übernommen wird.

    Gute Nacht
    Gruß Wolfgang
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Marc2468, 27.09.2006
    Marc2468

    Marc2468 Grünschnabel

    Dabei seit:
    26.09.2006
    Beiträge:
    9
    Zustimmungen:
    0
    @Lumpi: sorry, ich werds beim nächsten mal beachten!
     
  17. #15 Marc2468, 29.09.2006
    Marc2468

    Marc2468 Grünschnabel

    Dabei seit:
    26.09.2006
    Beiträge:
    9
    Zustimmungen:
    0
    Hi,
    da bin ich noch mal...
    mir ist noch ein Fehler aufgefallen,
    und wollte fragen, ob Ihr dafür ne Lösung wisst:
    Das Skript:
    Code:
    #!/bin/sh
    x=0
    for i in $(find /Users/marc/Desktop/test/ -iname "*.jpg");
    do
    ((x++));
    done
    if [  $x -gt 0 ];
    then
    echo "Es wurden $x Dateien mit der Endung .jpg gefunden";
    else
    echo "Keine Datei mit der Endung .jpg gefunden"
    fi
    
    funktioniert mit Dateien, deren Name nur ein Wort haben super...
    aber wenn man Dateien mit mehreren Wörtern im Dateinamen dabei hat, zählt er nicht die Dateien, sondern die Wörter.

    Bsp:
    Datei 1: a.jpg
    Datei 2: b.jpg
    Ausgabe: Es wurden 2 Dateien mit der Endung .jpg gefunden

    Das gerade genannte ist richtig, aber:

    Bsp2:
    Datei 1: a.jpg
    Datei 2: b.jpg
    Datei 3: so ein schönes Bild.jpg
    Ausgabe: Es wurden 6 Dateien mit der Endung .jpg gefunden

    das Problem ist, dass er in der Variable i jedes einzelne Wort des Dateinamen durchlaufen lässt und Zählt.
    ...
    was kann man da machen?!

    Was ich schon versucht hab is der wc -l (wordcount) Befehl, den hab ich aber gar nicht funktionierend unterbringen können. :-(

    Würde mich über eine Anwort freuen!
    Danke schon mal!

    Gruß Marc.
     
Thema:

Dateiendungen finden

Die Seite wird geladen...

Dateiendungen finden - Ähnliche Themen

  1. Dateiendungen Debian

    Dateiendungen Debian: Hallo, wenn ich ein ls mache haben bei mir die mp3 dateien rosa farbe. Für öffnen für mp3 dateien ist bei mir vlc verknüpft. Ich mochte gerne...
  2. Dateiendungen verändern

    Dateiendungen verändern: Hi, ich habe noch nicht viel mit Shell-Script gemacht und versuche nun Ordner umzubennen die zB ordner1_xlst heißen, jetzt soll er aber die...
  3. grip & Dateiendungen per Konsole ändern???

    grip & Dateiendungen per Konsole ändern???: Ich habe mir heute mit grip eine cd gerippt und nach ogg kodiert. Aus irgendeinem für mich unerfindlichen Grund hat grip aber alle dateien als mp3...
  4. Rechner im lokalen Netzwerk finden

    Rechner im lokalen Netzwerk finden: Hallo, in meiner Firma habe ich zwei Linux-Rechner, die ganz modern mit dem Internet verbunden sind. Jetzt möchte ich von dem einem Rechner...
  5. GUADEC 2016 wird in Karlsruhe stattfinden

    GUADEC 2016 wird in Karlsruhe stattfinden: Das Gnome-Projekt lässt seine jährliche Konferenz GUADEC im kommenden Jahr nach Karlsruhe kommen. Einzelheiten werden im Lauf der nächsten Monate...