2016-08-10 2 views
0

Ich bin neu in Scripting/Programmierung/alles und kann nicht scheinen, diese Bash-Skript/Schleife, die ich versuche zu iterieren.Verschachtelt für die Schleife in bash nicht richtig iterieren?

Ich habe ein Verzeichnis „Ordner“ genannt, in denen es viele Unterverzeichnisse, die jeweils Dateien enthalten, die ich (noch) Echo möchte

ich das, aber es scheint nicht das drucken Dateien innerhalb der Unterverzeichnisse, sondern druckt die Unterverzeichnisse selbst aus. Wie würde ich das Skript ändern, damit dies funktioniert?

for directory in *; 
do 
     for thing in $directory 
     do 
       echo $thing 
     done 
done 
+2

Sie nicht '$ {directory} wollen/*'? Oder perphaps '(cd" $ directory "; für thing in *; echo $ thing; done;)'. – Droppy

Antwort

3

Die Schleife for selbst durchläuft kein Dateisystem; Es iteriert nur über eine Folge von Strings. Sie müssen über das Ergebnis einer Pfadnamenerweiterung für die zweite Schleife iterieren.

for directory in *; 
do 
    for thing in "$directory"/* 
    do 
     echo "$thing" 
    done 
done 

Sie können dies mit einem komplexeren Muster mit einer Schleife tun:

for thing in */*; do 
    echo "$thing" 
done 
+0

Mit keiner Schleife meinst du etwas wie 'some_command */*'? Ich nehme an, dass der Körper der inneren Schleife komplizierter ist als ein einzelner eingebauter Befehl, in welchem ​​Fall dies Probleme mit großen Mengen von Übereinstimmungen hätte. – chepner

1

Bash Version 4.0 fügt eine neue Option Globbing globstar genannt, die das Muster behandelt ** anders, wenn es gesetzt ist.

#!/bin/bash 
shopt -s globstar 
for file in folder/** # with '**' bash recurses all the directories 
do 
    echo "$file" 
done 
+1

Das Array ist überflüssig und möglicherweise ein Speicherverlust; Sie können direkt über das Muster iterieren, was (glaube ich) nicht die gesamte Übereinstimmung im Speicher speichern muss. – chepner

+0

@chepner: Gut spitz! Geändert – sjsam

Verwandte Themen