Ich schreibe ein Skript, das ein bestimmtes Verzeichnis auf Unterverzeichnisse überprüft, die mit einem bestimmten Wort beginnen.
Hier ist mein bisheriges Skript:
#!/bin/bash
function checkDirectory() {
themeDirectory="/usr/share/themes"
iconDirectory="/usr/share/icons"
# I don't know what to put for the regex.
regex=
if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then
echo "Directories exist."
else
echo "Directories don't exist."
fi
}
Wie können Sie also regex
überprüfen, ob ein bestimmtes Verzeichnis Ordner enthält, die mit einem bestimmten Wort beginnen?
Antwort1
-d
akzeptiert keine regulären Ausdrücke, sondern Dateinamen. Wenn Sie nur ein einfaches Präfix prüfen möchten, reicht ein Platzhalter:
exists=0
shopt -s nullglob
for file in "$themeDirectory"/word* "$iconDirectory"/* ; do
if [[ -d $file ]] ; then
exists=1
break
fi
done
if ((exists)) ; then
echo Directory exists.
else
echo "Directories don't exist."
fi
nullglob
bewirkt, dass die Platzhalter zu leeren Listen erweitert werden, wenn es keine Übereinstimmungen gibt. In einem größeren Skript ändern Sie den Wert in einer Subshell oder setzen den alten Wert zurück, wenn Sie ihn nicht mehr benötigen.
Antwort2
Wenn Sie nur Verzeichnisse finden möchten, die einem bestimmten Muster/Präfix entsprechen, können Sie meiner Meinung nach einfach Folgendes verwenden find
:
find /target/directory -type d -name "prefix*"
oder, wenn Sie nur wollensofortUnterverzeichnisse:
find /target/directory -maxdepth 1 -type d -name "prefix*"
Natürlich gibt es das auch, -regex
wenn Sie eine tatsächliche Regex-Übereinstimmung benötigen. (Vorbehalt: Ich kann mich nicht erinnern, ob -maxdepth ein Gnu-ismus ist.)
(Update) Richtig, Sie wollten eine if-Anweisung. Find gibt immer eine Null zurück, daher können wir den Rückgabewert nicht verwenden, um zu prüfen, ob etwas gefunden wurde (anders als bei grep). Aber wir können z. B. die Zeilen zählen. Leiten Sie die Ausgabe weiter, wc
um die Anzahl zu erhalten, und prüfen Sie dann, ob sie nicht Null ist:
if [ $(find /target/directory -type d -name "prefix*" | wc -l ) != "0" ] ; then
echo something was found
else
echo nope, didn't find anything
fi
Antwort3
Der Name Ihrer Variable regex
ist vielleicht nicht gut gewählt, aber Sie sollten den Wert auf "$1"
like setzen. Der nächste Schritt besteht darin, die Anweisung wie folgt regex="$1"
zu ändern :if
if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then
Zu
if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then
Das Skript sieht folgendermaßen aus:
function checkDirectory() {
themeDirectory="/usr/share/themes"
iconDirectory="/usr/share/icons"
# I don't know what to put for the regex.
regex="$1"
if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then
echo "Directories exist."
else
echo "Directories don't exist."
fi
}
Von einer Shell aus können Sie Ihr Skript folgendermaßen beziehen:
. /path/to/script
Und die Funktion ist einsatzbereit:
checkDirectory test
Directories don't exist.