Ich suche einen Befehl, der den Eigentümer eines Verzeichnisses zurückgibt und nur diesen - wie eine Regex, die den ls -lat
Befehl analysiert, oder etwas Ähnliches? Ich möchte das Ergebnis in einem anderen Skript verwenden.
shell-script
ls
Jason
quelle
quelle
stat
(einen Site-weiten Standard) in/usr/local/bin
oder irgendwo im Haus des Benutzers geben) und er ist selten verfügbar auf anderen unices.stat -c %U
hat den Vorteil, auch mit BusyBox zu arbeiten , wenn derstat
Befehl in kompiliert ist.stat -c '%U' DIR
gedruckt wirdUNKNOWN
, was je nach Ansicht weniger hilfreich oder angemessener ist.Das Parsen der Ausgabe von
ls
ist selten eine gute Idee , aber das Erhalten der ersten Felder ist eine Ausnahme, es funktioniert tatsächlich auf allen "traditionellen" Unices (es funktioniert nicht auf Plattformen wie einigen Windows-Implementierungen, die Leerzeichen in Benutzernamen zulassen).Eine andere Option ist die Verwendung eines
stat
Befehls. Das Problem mitstat
der Shell besteht jedoch darin, dass mehrere Befehle mit unterschiedlicher Syntax vorhanden sind, sodassstat
ein Shell-Skript nicht portierbar ist (auch nicht für Linux-Installationen).Beachten Sie, dass das Testen, ob ein bestimmter Benutzer der Eigentümer ist, eine andere Angelegenheit ist.
quelle
ls | awk
Leider gibt es auch einige Vorbehalte bei der Herangehensweise, wie ich hier bemerkt habe . Ich habe noch keine Lösung für das Problem "Zieldatei / Verzeichnis ist ein Symlink mit einem anderen Namen" gefunden, das ich kürzlich in meinem Kommentar erwähnt habe.find . -user "$username" -print -prune -o -prune
könnten Sie einfach tunfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
anstatt nurawk '{print $3}'
? Ich bin mir nicht sicher, warum dasNR==1
hier notwendig ist.ls
eine neue Zeile in einem Pfad dazu führt, dass die Zeile in zwei Teile geteilt wird (was meiner Meinung nach der Randfall ist, den Sie abdecken möchten)? Auf GNUls
(neuere Version), BusyBoxls
und FreeBSDls
ist ein Newline zurückgeführt, wie$'\n'
,?
und?
, respectively.Das kann man auch mit GNU find machen:
Dies ist außerhalb des GNU-Systems nicht portierbar, aber ich wäre überrascht, eine Linux-Distribution zu finden, bei der es nicht funktioniert.
quelle
find
dies nicht der Fall ist-printf
.-printf
:-(.In pure bash können Sie die Ausgabe von
ls
in ein Array konvertieren und in dieses indexieren.Es ist nicht so elegant wie die Verwendung von
stat
,find
oderawk
, könnte aber zur Not funktionieren.quelle