
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 bash
setzen, 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 :nullglob
shopt -s nullglob
nullglob
$dir
$dir
touch
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/main
Und 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 \;