Dateiendungen finden

M

Marc2468

Grünschnabel
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.
 
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
 
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.
 
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
 
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.
 
So wie ich sehe, willst du die Dateiendungen haben.
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.....
Wolfgang schrieb:
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ß Lumpi
 
:


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.

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
 
Zuletzt bearbeitet:
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
 
@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.
 
Also ich denke es liegt an einem Typo im Skript.
...
Das x in der fünften Zeile muß auch groß geschrieben werden!

@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.
 
Danke noch mal an alle die mir hier geholfen haben!
Und besonders an Wolfgang und SkydiverBS!
Genau das wollte ich. :D
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
 
Hallo,

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

Gruß Lumpi
 
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
 
@Lumpi: sorry, ich werds beim nächsten mal beachten!
 
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.
 
Hallo
Das Problem mit hässlichen Dateinamen taucht hier immer wieder auf.
Leerzeichen und Sonderzeichen im Dateienamen sind die Stichworte, nach denen du hier mal im Board suchen kannst.
Dazu haben sich hier schon einige den Finger wund geschrieben. ;)
Die Bash/ksh trennt ihre Positionsparameter an dem Wert der Umgebungsvariable IFS.

Diese enthält per default [ Tab Space Newline].

Schau dir mal die Kombination aus find und xargs an:
find /foo -name "*bar" -print0|xargs -0 -n1 echo
man find
man xargs

Wenn du das verstanden hast, ist es sehr einfach.

Oder du verwendest ein Konstrukt mit read.
Das funktioniert, solange du keine Steuerzeichen oder Zeilenumbrüche im Dateinamen hast.
Wenn du eine Zählvariable brauchst, dann musst du ausserhalb von read zählen, da bei den meisten Shells eine Pipe in einer Subshell läuft => Variablen sind dann local und für die parent Shell nicht sichtbar.
Beispiel:
Code:
x=$(find . -name "*jpg" |while read name; do echo "$name";done|wc -l)
if [ $x -gt 0 ];
then
echo "$x Dateien gefunden";
else
echo "Keine Dateien gefunden";
fi
...
Oder mit xargs und print0
Code:
$ x=$(find . -name "*\.jpg" -print0|xargs -0 -n1 echo|wc -l);
if [ $x -gt 0 ];
 then 
 echo $x gefunden;
 else
 echo nicht gefunden;
fi

Gruß Wolfgang
PS Wer Fipptehler im Code findet, darf das gern korrigieren.(weil der Code ungetestet ist) ;)
 
Zuletzt bearbeitet:

Ähnliche Themen

Returncode ($?) bei find immer "0" ?

If-Abfrage kommt nicht positiv zurück, obwohl Kriterium erfüllt

[gelöst] - for file in ... nur für bestimmte Endungen?

Shell Skript beschleunigen

Rückgabe eines Befehls

Zurück
Oben