curt123 hat geschrieben: 13.11.2021 16:49:39
Schließlich habe ich bei diesem Code
gesehen, dass eine Afrage wie nach *.txt im Array bei leerem Verzeichnis ein Element "*.txt" erzeugt.
Ja, das ist richtig. Wenn keine Datei oder Ordner existiert, der auf das Muster passt, bleibt das Muster „wörtlich“ stehen. Das kann man mit
abschalten, dann wird das nicht-treffende Muster zu einem leeren String. Die Option ist allerdings, meine ich, ein reines Bash-Feature.
curt123 hat geschrieben: 13.11.2021 16:49:39
Die Lösung sieht jetzt so aus:
Code: Alles auswählen
is_in_dir () {
files=("$1")
if [ ${#files[@]} -gt 0 ] && [[ ${files[0]} != *"*"* ]]
then
echo 1
else
echo 0
fi
}
echo $(is_in_dir ./*.txt)
Das wird nicht ganz funktionieren. Edit: Korrigiere, das funktioniert, aber nur weil du das ./*.txt beim Aufruf der Funktion nicht gequotet hast. Die Pfad-Expansion (Dateipfad mit nem * drin) ist eine der wenigen Zeichenketten, die man
nicht in Quotes verpacken darf, sonst verliert sie ihre Funktion (also nur das Sternchen darf nicht in Quotes stehen, der Rest bei Bedarf schon). So hast du auch immer nur ein Array mit genau einem Element,
*.ext.
Du lädst damit (mit korrekt nicht-gequotetem $1) auch immer alle Ordnerelemente in das Array, das kann unnötige Arbeit sein.
Ein paar Alternativen, die mir spontan einfallen:
Mit
find, damit kannst du das auch gleich mit
-type f auf nur Dateien reduzieren:
Code: Alles auswählen
is_in_dir()
{
# Hier muss man beides quoten, da find hier das Muster benutzen soll, nicht die Shell.
# Ausrufezeichen am Anfang ist wichtig.
! find "$1" -maxdepth 1 -type f -name "$2" -exec false {} + -quit
}
is_in_dir /some/dir "*.txt" && echo "Found one!"
Mit
ls ohne weitere Einschränkung:
Code: Alles auswählen
is_in_dir()
{
ls $1 >/dev/null 2>&1
}
is_in_dir "/some/dir/*.txt" && echo "Found one!"
Reine Shell, auch mit Einschränkung auf Dateien, mit frühem
return, sobald eine passende Datei gefunden wurde:
Code: Alles auswählen
is_in_dir()
{
for f in $1; do
[ -f "$f" ] && return 0
done
return 1
}
is_in_dir /some/dir "*.txt" && echo "Found one!"
Ich vermute mal, dass diese Variante die schnellste ist.
Die letzten beiden Varianten, also außer der mit
find, funktionieren so nicht mit Pfaden mit Leerzeichen.
curt123 hat geschrieben: 13.11.2021 16:49:39
Abgesehen davon, ob die Lösung verläßlich oder "sauber" ist, interessiert mich der Eintrag bei fehlender Datei.
Ist das ähnlich wie bei der folgenden Meldung?
Das versteh ich nicht so ganz. Wenn keine passende Datei gefunden wurde, möchtest du den Namen eines Ordners haben, der zum Muster passt?