
Gibt es unter Linux eine Möglichkeit,Sortieren ls
der Ausgabe nach Benutzern? Ich versuche ungefähr Folgendes zu erreichen:
Benutzer_A Datei1
Benutzer_A file2
Benutzer_B anderer_Dateibenutzer_
C diese_Datei
Benutzer_C that_file
Benutzer_D Datei3
Mir ist bewusst, dass eine solche Auflistung auch Dateigröße, Berechtigungen usw. enthalten würde – mein Hauptanliegen ist die Sortierung nach Benutzern. Wäre doch ganz praktisch, oder?
Bisher habe ich herausgefunden, ls -l | sort -k 3
dass die Sortierung nach Spalte drei erfolgt, die [bei Verwendung von ls -l
] den Dateieigentümer enthält [also sort -k 4
die Sortierung nach Gruppe].
ABERWas passiert, wenn der Dateibesitzer nicht in Zeile drei steht? Gibt es eine andere Möglichkeit,Dies erreichen Sie unabhängig von der Nummer der Spalte?
Aktualisieren: Ich habe vergessen zu erwähnen, dassIch arbeite in BASHund versuchen Sie von nun an eine ganze Weile dabei zu bleiben, damit die Dinge nicht komplizierter werden.
Antwort1
Es ist nicht möglich , aus einer einzelnen Ausgabe zu bestimmen, in welcher Spalte der Eigentümername steht, ls -l
ohne zu wissen, welche Spalte welche ist. Sie könnten versuchen, die Einträge in jeder Spalte mit der passwd
Datei abzugleichen, aber es gibt keine Garantie dafür, dass Sie nicht die Gruppenspalte oder die Dateinamenspalte abgleichen, die beide nur Namen enthalten können, die Sie in finden /etc/passwd
.
Wenn Sie mit arbeiten möchten ls
, können Sie das Programm zweimal ausführen, einmal als ls -l
und einmal als ls -g
. Letzteres lässt den Besitzer fallen, sodass Sie durch Abgleichen der Zeilen anhand der anderen Informationen den Namen des Besitzers ohne Angabe ermitteln können. Dies ist jedoch keine Übung, die ich gerne in einem Bash-Shell-Skript durchführen würde.
Antwort2
Mit zsh
können Sie Sortierreihenfolgen definieren und diese in Globbing-Qualifizierern verwenden, wie:
zmodload zsh/stat
uid() zstat -A REPLY +uid -- $REPLY
... *(no+uid)
( n
für numerische Reihenfolge, o
fürBefehl, +uid
um mit der uid
Funktion zu sortieren). Die Idee besteht darin, eine Funktion zu haben, die einen Dateinamen entgegennimmt $REPLY
und etwas zurückgibt, $REPLY
das zsh
sortiert wird.
So zum Beispiel mit GNU ls
:
ls -ldU -- *(no+uid)
Mit reinen GNU-Tools würde das Äquivalent etwa so aussehen:
find . ! -name . -prune -printf '%U\t%p\0' |
sort -zn |
tr '\0\n' '\n\0' |
cut -f2- |
tr '\0\n' '\n\0' |
xargs -r0 ls -ldU
Antwort3
Nicht analysierenls
: verwendenstat
stat -c "%U %n" -- * | sort
Antwort4
1) Bestimmen Sie, welche Spalte den Namen hat:
myls='ls -al'
echo '+' > /tmp/MYOWNFILE.$$ #so file will be of size 2, "+" and newline.
zeuser=$( $myls /tmp/MYOWNFILE.$$ | awk -v myname=$(whoami) '{ for (field=1;field<=NF;field++) { if ($field == myname) { print field ; break } } }' )
zesize=$( $myls /tmp/MYOWNFILE.$$ | awk '{ for (field=1;field<=NF;field++) { if ($field == 2) { print field ; break } } }' )
zename=$( $myls /tmp/MYOWNFILE.$$ | awk -v filename=/tmp/MYOWNFILE.$$ '{ for (field=1;field<=NF;field++) { if ($field == filename) { print field ; break } } }' )
rm /tmp/MYOWNFILE.$$
Es fügt in die Variable zeuser die Spalte mit dem Benutzernamen ein.
Ich bestimme auch zesize=Spalte mit der Größe und zename=Spalte mit dem Dateinamen
Ich werde den Befehl ls in eine Variable einfügen, sodass die Zeilen, die die Spalte bestimmen, den tatsächlichen Befehl verwenden, der später verwendet wird (falls Sie ihn ändern und dadurch die aufgelisteten Spalten geändert werden).
2) Verwenden Sie „Sort“, um nach dieser Spalte zu sortieren:
$myls | sort -k${zeuser},${zeuser} #sort ONLY on column of usernames (see last example for bad alternative)
$myls | sort -k${zeuser},${zeuser} -k${zename},${zename} #sort on user, and then on filename
$myls | sort -k${zeuser},${zeuser} -k${zesize},${zesize}nr #sort on user,
# and then on size
#modifiers: 'n'=order Numerically (and not alphabetically),
# 'r'=Reverse order
$myls | sort -k${zeuser} #sort STARTING FROM user column, which is probably not what you want!
#indeed the next column is probably the group, then the size...
#It will be sorting in a not so usefull way (especially as the
# size will be sorted alphabetically instead of numerically)