Sortieren Sie die LS-Ausgabe nach Benutzern

Sortieren Sie die LS-Ausgabe nach Benutzern

Gibt es unter Linux eine Möglichkeit,Sortieren lsder 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 3dass die Sortierung nach Spalte drei erfolgt, die [bei Verwendung von ls -l] den Dateieigentümer enthält [also sort -k 4die 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 -lohne zu wissen, welche Spalte welche ist. Sie könnten versuchen, die Einträge in jeder Spalte mit der passwdDatei 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 -lund 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 zshkönnen Sie Sortierreihenfolgen definieren und diese in Globbing-Qualifizierern verwenden, wie:

zmodload zsh/stat
uid() zstat -A REPLY +uid -- $REPLY

... *(no+uid)

( nfür numerische Reihenfolge, ofürBefehl, +uidum mit der uidFunktion zu sortieren). Die Idee besteht darin, eine Funktion zu haben, die einen Dateinamen entgegennimmt $REPLYund etwas zurückgibt, $REPLYdas zshsortiert 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)

verwandte Informationen