![Wie testet man, ob eine oder mehrere Dateien mit einem Präfix in Bash vorhanden sind? zB [[-f foo*]]](https://rvso.com/image/178564/Wie%20testet%20man%2C%20ob%20eine%20oder%20mehrere%20Dateien%20mit%20einem%20Pr%C3%A4fix%20in%20Bash%20vorhanden%20sind%3F%20zB%20%5B%5B-f%20foo*%5D%5D.png)
Gibt es eine Möglichkeit, einenDateinamenerweiterunginnerhalb einestest
Ausdruck, genauer gesagt, einBash-bedingter Ausdruck?
Zum Beispiel:
[[ -f foo* ]] && echo 'found it!' || echo 'nope!';
... wird ausgegeben"Nein!"entweder ob die foobar
Datei im aktuellen Verzeichnis existiert oder nicht.
Und ein var
„Gefällt mir“ hinzufügen...
bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';
... wird ausgegeben"fand es!"wenn die foobar
Datei existiert, aber nur, wenn die echo $bar
Erweiterung nur eine Datei zurückgegeben hat.
Antwort1
Im Folgenden wird davon ausgegangen, dass es Ihnen egal ist, ob der Glob mit irgendwelchen Dateien übereinstimmt, einschließlich Block-Sonderdateien, Zeichen-Sonderdateien, Verzeichnissen, symbolischen Links usw.
Dies ist der ideale Anwendungsfall für failglob
:
shopt -s failglob
if echo foo* &>/dev/null
then
# files found
else
# no files found
fi
Oder, wenn Sie die Liste der Dateien benötigen, sofern diese vorhanden sind:
shopt -s failglob
files=(foo*)
if [[ "${#files[@]}" -eq 0 ]]
then
# no files found
else
# files found
fi
Wenn es sich um einen Fehler handelt, bei dem keine Dateien gefunden wurden, können Sie Folgendes vereinfachen:
set -o errexit
shopt -s failglob
files=(foo*)
# We know that the expansion succeeded if we reach this line
Alte Antwort
Dies könnte eine (seltene!) legitime Verwendung ls
in einem Skript sein:
if ls foo* &>/dev/null
then
…
else
…
fi
Alternative, find foo* -maxdepth 0 -printf ''
.
Antwort2
Bezogen aufdiese Antwortkönnen wir verwenden, shopt -s nullglob
um sicherzustellen, dass nichts zurückgegeben wird, wenn das Verzeichnis leer ist:
[[ -n "$(shopt -s nullglob; echo foo*)" ]] && echo 'found it!' || echo 'nope!';
Antwort3
Der Vollständigkeit halber hier einige Beispiele mit find
:
#!/bin/bash
term=$1
if find -maxdepth 1 -type f -name "$term*" -print -quit | grep -q .; then
echo "found"
else
echo "not found"
fi
if [ -n "$(find -maxdepth 1 -type f -name "$term*" -print -quit)" ]; then
echo "found"
else
echo "not found"
fi
Und einige Tests:
user@host > find -type f
./foobar
./bar/foo
./bar/bar
./find_prefixed_files.sh
./ba
user@host > ./find_prefixed_files.sh foo
found
found
user@host > ./find_prefixed_files.sh bar
not found
not found