Verwenden Sie reguläre Ausdrücke, um zu überprüfen, ob ein bestimmtes Verzeichnis Ordner enthält, die mit einem bestimmten Wort beginnen

Verwenden Sie reguläre Ausdrücke, um zu überprüfen, ob ein bestimmtes Verzeichnis Ordner enthält, die mit einem bestimmten Wort beginnen

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

-dakzeptiert 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

nullglobbewirkt, 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, -regexwenn 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, wcum 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 regexist 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.

verwandte Informationen