2017-04-17 6 views
0

Wo sich dieses Skript befindet, habe ich mehrere Unterverzeichnisse, in denen ich einen einzigen Befehl für alle Inhalte ausführen möchte. Der Inhalt ist ebenfalls in aufsteigender Reihenfolge nummeriert. Wenn Sie for f in * in Ordnern mit mehr als 10 Elementen verwenden, werden die Dateien 10 oder 11 nacheinander vor 1..9 angezeigt.Dateien in numerischer Reihenfolge verarbeiten

Darüber hinaus variiert die Anzahl der Dateien in jedem Unterverzeichnis zwischen 6 und 12 Elemente, also glaube ich nicht, dass ich einfach eine Bereichsoperation wie {1..12} ausführen kann, weil ich Warnungen/Fehler über nicht vorhandene Dateien vermeiden möchte.

Frage: Gibt es eine Möglichkeit zum Forcen oder Ändern der FOR-Schleife zur Aufrechterhaltung der aufsteigenden numerischen Reihenfolge beim Iterieren über den gesamten Inhalt eines Ordners, ohne die Menge des Ordners zu kennen?

term=""     # hold accumulated filenames 

for d in */ ; do   # iterate over sub-directories 
    cd $d 
    for f in * ; do  # iterate over files in sub-directory 
     term="$term $f" 
    done 
    # run a command using the string $term 
    term="" 
    cd .. 
done 

Randbemerkung: Ich getaggt sh, shell und bash da sie alle für dieses Problem sind. Ich lese Difference between sh and bash vor dem Hinzufügen beider Tags, um sicherzustellen, dass es eine gültige Wahl wäre, obwohl es einige Syntax/Portabilitätsvariationen und dergleichen gibt.

Antwort

1

Sie können dafür die ls Option -v verwenden. Von man ls:

-v natural sort of (version) numbers within text

Wenn Sie Ihren inneren Schleife zu

for f in `ls -v` ; do  # iterate over files in sub-directory 
    term="$term $f" 
done 

Die Ergebnisse aus ls werden ändern numerischer Reihenfolge sortiert aufsteigend.

Eine weitere Option ist sort, von man sort:

-g, --general-numeric-sort compare according to general numerical value

die Ergebnisse aus ls durch sort -g das gleiche Ergebnis Rohrleitungen.

bearbeiten

Da die Ausgabe von ls auch mit find mit bekommen Dateinamen is a bad idea, sollten Sie stattdessen, z.B.

+0

Danke für das Beispiel @resc, es hilft. –

Verwandte Themen