So führen Sie eine Schleife in allen Verzeichnissen innerhalb eines Verzeichnisses aus

So führen Sie eine Schleife in allen Verzeichnissen innerhalb eines Verzeichnisses aus

Nehmen wir an, ich habe ein Verzeichnis namens /tmp/main und darin befinden sich 100 weitere Verzeichnisse.

Ich möchte eine Schleife durch jedes dieser Verzeichnisse laufen lassen, um beispielsweise eine Datei mittouch test.txt

Wie weise ich das Skript an, das erste, das zweite, das dritte usw. zu verarbeiten?

Antwort1

Eine einfache Schleife würde funktionieren:

for dir in /tmp/main/*/; do
    touch "$dir"/test.txt
done

Das /am Ende des Musters /tmp/main/*/garantiert, dass, wenn das Muster mit irgendetwas übereinstimmt, es mit einem Verzeichnis übereinstimmt.

In möchten Sie möglicherweise die Shell-Option mit vor der Schleife bashsetzen, um sicherzustellen, dass die Schleife überhaupt nicht ausgeführt wird, wenn das Muster nicht übereinstimmt. Ohne Set würde die Schleife trotzdem einmal mit dem nicht erweiterten Muster in ausgeführt . Eine andere Möglichkeit, dies zu beheben, besteht darin, sicherzustellen, dass es sich tatsächlich um ein Verzeichnis handelt, bevor Sie aufrufen :nullglobshopt -s nullglobnullglob$dir$dirtouch

for dir in /tmp/main/*/; do
    if [ -d "$dir" ]; then
        touch "$dir"/test.txt
    fi
done

oder gleichwertig,

for dir in /tmp/main/*/; do
    [ -d "$dir" ] && touch "$dir"/test.txt
done

Antwort2

Sie können Folgendes verwenden find:

find /tmp/main -type d -exec touch {}/test.txt \;

/tmp/mainUnd wenn Sie den Ordner von der Rückgabe in den Nutzungsergebnissen ausschließen möchten find:

find /tmp/main ! -path /tmp/main -type d -exec touch {}/test.txt \;

oder

find /tmp/main -mindepth 1 -type d -exec touch {}/test.txt \;

verwandte Informationen