Pfad aus .txt Datei auslesen und für ls-Befehl verwenden

A

ALKA

Grünschnabel
Hallo liebe Unix Community,

ich versuche mich gerade an einer userid.txt Datei bei der jeder Benutzer eine eigene Zeile besitzt in der sich ein Laufwerkspfad befindet, den ich gerne verwenden möchte um mir alle Dateien in diesem Pfad über "ls" anzeigen zu lassen.

Vereinfacht ausgedrückt:
Folgende Textdatei:
Code:
max:##max:0:1:User:/:/sbin/sh
anna:##anna:508:10:& anna:/usr2/anna:/bin/csh

Der Aufruf des Kommandos soll „meineausgabe <uid>“ sein und den Inhalt des Verzeichnisses des jeweiligen Users ausgeben.

Kann mir dabei jemand helfen?

Viele Grüße,
eure ALKA
 
Huhu,

das hier sollte funktionieren:

Code:
#!/bin/bash
ID=$1

awk -F ':' '{print $1, $3, $6}' userid.txt | while read NAME FOUNDID PATH
do
if [ $ID = $FOUNDID ] ; then
/bin/ls $PATH
fi
done

./script.sh 0 gibt den Inhalt von / aus.

Edit: Interessant duerften noch Aliase fuer dich sein.
 
Zuletzt bearbeitet:
Hallo, vielen Dank für die schnelle Antwort.

Gibt es nicht auch eine etwas einfachere Variante die mehr in Richtung "regular expressions" geht?

Würde gerne das Shell-Skript so klein wie möglich halten und z.B. mittels grep Befehl das Ergebnis für den ls-Befehl pipen.
 
Guten Abend,

ich kriege aber das Skript nicht zum laufen.
habe es mit ./script.sh 0 versucht auszuführen.

Gibt es keine Möglichkeit mit regulären Ausdrücken zu arbeiten, anstatt mit mit Bedingungen?

Viele Grüße,
eure ALKA
 
Mh,

du erstellst ein Textfile, fuegst den Inhalt ein, passt den Pfad zur userid.txt an, macht chmod +x script.sh und dann fuehrst du das Script aus.
 
Okay, es funktioniert. Vielen Dank erstmal dafür.

Aber da ich mich für eine Klausur vorbereite, werde ich in der Klausur nicht die Möglichkeit haben "Bash-Skripte" zu schreiben.

ich suche etwas in Richtung "ls -R | grep ..."

habe es bereits mit den Befehlen "sed" und "find" ausprobiert. Aber die shell gibt mir immer nur die ganze Zeile aus.
 
Hallo ALKA,
ganz kurz und knapp geht es auch so, ist aber nur bedingt fehlerfrei (UID muss vorhanden sein, Verzeichnis muss vorhanden sein usw.)
Gruß zst

Code:
ls -l $(grep ":$1:" alka-user.dat | cut -d ":" -f6)
 
Hey zst,

das geht schon mal in die richtige Richtung.
Habe dein Beispiel versucht, aber er geht nicht wirklich auf die Pfade in der user.txt ein.

Z.B. beim User anna heißt der Pfad "/bin/csh".

Mit deinem Befehl listest er mir seltsamerweise alle Datein meines current Ordners, in dem ich mich aktuell befinde.

Hatte einen Kollegen auf der Arbeit bereits gefragt, aber er konnte mir auch nicht weiterhelfen ; (


Vielleicht kannst du mir kurz erklären was die einzelnen Bausteine semantisch für eine Bedeutung haben. Dann könnte ich anhand dessen selber daran arbeiten.
 
Hallo ALKA,

ich nutze gerade openSUSE und bash 3.2
Bei User anna sollte ja das Verzeichnis /usr2/anna aufgelistet werden, sofern Du die Rechte dazu hast. Das funktioniert bei mir (als root).
Wenn bei Dir /bin/csh statt /usr2/anna ermittelt wird, kannst Du das über den cut-Parameter beeinflussen (dann setze -f6 auf -f5).
Das der Einzeiler keine wirklich saubere Lösung ist, hatte ich erwähnt.
Ach so: Den Einzeiler musst Du als Script aufrufen und als Parameter die user-id.
Die user-id wird (eingeschlossen von Doppelpunkten) in der user.txt gesucht.
Aus der gefundene Zeile wird das 6. Feld (/usr2/anna) an ls -l übergeben.
Gruß zst
 
Wie zst schon schrieb, es testet nicht auf eventuelle Fehler.

Wenn dein aktuelles Verzeichnis aufgelistet wird, hat das $(...) keine Ausgabe geliefert.

ls -l --> klar oder?
$(...) das ergebnis dieser befehle wird übergeben (Kommandosubstitution)
grep ":$1:" alka-user.dat --> suche die zeile in der input datei, die den parameter enthält
| cut -d ":" -f6 -> schneide die 6. Stelle aus, wobei ":" als Trennzeichen dient.

Der Fehler warum keine Ausgabe vorlag, liegt nebenbei hier:
Code:
grep ":$1:" alka-user.dat
Das könnte zum Beispiel
Code:
grep "$1: alka-user.dat
heissen, denn das Feld des Usernames ist nicht in Doppelpunkte eingeschlossen,
sondern wird nur durch einen beendet.
Somit bekommt das grep-command keinen Match und somit keine Ausgabe des ganzen Ausdrucks.
 
Zuletzt bearbeitet:
Hallo NoXqs,
es sollte die User-id, nicht der user-name gesucht werden, daher ist der Einschluss in zwei Doppelpunkte korrekt.
Gruß zst
 
Oh, sorry.
Das hatte ich übersehen, ich bin von Usernamen ausgegangen.
Dann sollte das alles so funktionieren, solange die angegebene UID auch existiert.
 
Danke für die Erläuterung. Vielleicht habe ich es auch übersehen, aber was bedeutut $1 in diesem Zusammenhang?
 
$1 ist die user-id, die Du dem Script übergeben musst.
Du kannst $1 auch gegen eine user-id ersetzen, also so:
ls -l $(grep ":508:" alka-user.dat | cut -d ":" -f6)
 

Ähnliche Themen

HOWTO Installationshilfe für ein 2- oder mehr-CD Spiel auf einer DVD

Zurück
Oben