Einführung in die Shell-Programmierung

Shells

Auswahl einzelner Dateien aus Unterverzeichnissen


In der Praxis kommt es immer wieder vor, dass man aus einer Menge von Verzeichnissen bestimmte Files auswählen muss, so zum Beispiel jeweils die neueste Datei oder die Datei, die als erstes nach der alphabetischen Aufzählung erscheint.


Im folgenden werden sie sehen, wie einfach es ist solche Aufgbaben mit der Bourne-Shell unter Linux oder Unix zu lösen.

Tree-View der Beispiel-StrukturUm die folgenden Lösungen nachvollziehen zu können, bieten wie Ihnen hier das Beispiel-Verzeichnis Test zum Download an. (Entpacken: Speichern Sie es in einem Verzeichnis Ihrer Wahl. Dann führen Sie bitte den folgenden Befehl aus: "tar xvjf test.tbz2")
In dem Verzeichnis Test befinden sich die Unterverzeichnisse a, b, c, usw. bis i   In jedem dieser Verzeichnisse befinden sich jeweils sechs Dateien mit den Endungen  jpg, xml und txt. Wundern Sie sich bitte nicht, dass alle Files leer sind, denn für dieses Beiespiel benötigen wir keine sinnvollen Dateien mit Inhalt.

Nehmen wir nun an, sie wollen aus jedem Unterverzeichnis das neueste File finden und ausdrucken. Dazu benötigen wir eine Schleife über die Unterverzeichnisse und den Befehl ls und head. Der Parameter -1 bei ls sorgt dafür, dass jede Datei in eine eigene Zeile kommt und -t bestimmt, dass die Files in zeitlicher Reihenfolge ausgegeben werden, d.h. die neuesten zuerst. Mit "head -1" erhält man nun das neueste File.

#!/bin/sh
# Schleife über alle Unterverzeichnisse
for i in *
do
# Das folgende wird nur ausgeführt,
# wenn $i ein Directory bezeichnet:
if [ -d $i ]
then
# verzweigt in das aktuelle Unterverzeichnis:
cd $i
# Damit man sieht, aus welchem Verzeichnis
# das später zu druckende
# Ergebnis kommt
echo -n "$i: ";
# wird im Haupttext näher erläutert:
ls -1t | head -1 ;
# zurück zum Eltern-Verzeichnis:
cd ..;
fi
done

Hätte die Aufgabe darin bestanden, die Text-Datei mit der niedrigsten Nummer in jedem Unterverzeihnis auszugeben, so brauchen wir nur ls mit "-l *.txt" aufzurfen, also

#!/bin/sh
# Schleife über alle Unterverzeichnisse
for i in *
do
# Das folgende wird nur ausgeführt,
# wenn $i ein Directory bezeichnet:
if [ -d $i ]
then
# verzweigt in das aktuelle Unterverzeichnis:
cd $i
# Damit man sieht, aus welchem Verzeichnis
# das später zu druckende
# Ergebnis kommt
echo -n "$i: ";
# wird im Haupttext näher erläutert:
ls -1 *txt | head -1 ;
# zurück zum Eltern-Verzeichnis:
cd ..;
fi
done
Ergebnis, wenn man obiges Skript in dem Verzeichnis test startet:

a: 001.txt
b: 001.txt
c: 001.txt
d: 001.txt
e: 001.txt
f: 001.txt
g: 001.txt
h: 001.txt
i: 001.txt

Die höchste Nummer eines Files erhält man, wenn man head mit tail ersetzt. Äußerst interessant ist noch, dass man auch jede andere Position durch geschicktes Hintereinanderausführen von head und tail erhalten kann. so erhält man zum Beipiel die Dateien mit der viert-niedrigsten Nummer mit:
ls -1 *txt | head -4 | tail -1;
liefert folgendes Ergebnis:

a: 004.txt
b: 004.txt
c: 004.txt
d: 004.txt
e: 004.txt
f: 004.txt
g: 004.txt
h: 004.txt
i: 004.txt




© Copyright 2004 - 2008, Bodenseo, Linux-Kurse am Bodensee, Bernd Klein