Wie testet man, ob eine oder mehrere Dateien mit einem Präfix in Bash vorhanden sind? zB [[-f foo*]]

Wie testet man, ob eine oder mehrere Dateien mit einem Präfix in Bash vorhanden sind? zB [[-f foo*]]

Gibt es eine Möglichkeit, einenDateinamenerweiterunginnerhalb einestestAusdruck, genauer gesagt, einBash-bedingter Ausdruck?

Zum Beispiel:

[[ -f foo* ]] && echo 'found it!' || echo 'nope!';

... wird ausgegeben"Nein!"entweder ob die foobarDatei 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 foobarDatei existiert, aber nur, wenn die echo $barErweiterung 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 lsin 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 nullglobum 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

verwandte Informationen