Suchen von Dateien, bei denen Gruppenberechtigungen den Benutzerberechtigungen entsprechen

1

Kann man so etwas machen find -perm g=u? Ich sage "Gefällt mir", weil -perm modeder Modus die Angabe aller Bits erfordert, nicht nur g, und weil ich nicht uauf die rechte Seite von setzen kann =, wie ich es mit dem chmodBefehl kann:

you can specify exactly one of the letters ugo: the permissions granted
to  the  user  who  owns the file (u), the permissions granted to other
users who are members of the file's  group  (g),  and  the  permissions
granted  to  users  that are in neither of the two preceding categories
(o).

Im Moment mache ich find | xargs -d \\n ls -lartd | egrep '^.(...)\1das einfach nur hässlich.

Vielen Dank.

Jayen
quelle

Antworten:

2

Das ist viel schöner (erzeugt eine durch Zeilenumbrüche getrennte Ausgabe):

find . -type f -printf '%04m%p\n' | perl -ne 'print substr($_, 4) if /^.(.)\1/'

Oder dies, wenn einer Ihrer Dateinamen möglicherweise Zeilenumbrüche enthält (erzeugt eine durch Nullbyte getrennte Ausgabe):

find . -type f -printf '%04m%p\0' | perl -n0e 'print substr($_, 4) if /^.(.)\1/'

Im Wesentlichen erzeugt der Befehl find eine Ausgabe wie folgt:

0644./.config/banshee-1/banshee.db
0664./.config/gedit/gedit-print-settings
0664./.config/gedit/gedit-page-setup
0644./.config/gedit/accels

Der Perl-Befehl filtert dann diese Ausgabe und entfernt den Dateimodus, bevor eine übereinstimmende Zeile gedruckt wird:

./.config/gedit/gedit-print-settings
./.config/gedit/gedit-page-setup

Wenn Sie Verzeichnisse, FIFOs, Sockets und Geräteknoten anstatt nur Dateien einschließen möchten, lassen Sie das weg -type f. Dann erscheinen alle symbolischen Links in der Liste (da sie immer den Modus 0777 haben). Sie können sie also entweder mit ausschließen ! -type loder ihnen mit folgen -L.

PleaseStand
quelle
-printfGenie!
Jayen
1

Versuchen Sie dies: (musste bearbeiten, vernachlässigt, um Dateinamen mit Leerzeichen zu behandeln)

find . -type d -or -type f -ls | \
 awk '{ perm=$3; fname=11; if (substr(perm,1,3) == substr(perm,4,3)) { printf "%s",perm; while (fname<=NF) printf " %s",$(fname++); printf "\n"; } }'

Leitung an der Leitung zwecks Lesbarkeit geteilt, aber funktional nur eine Leitung

Verwenden Sie find, um nur Dateien und Verzeichnisse anzuzeigen, bei denen Symlinks (immer mit lrwxrwxrwx-Perms), Sockets und andere unerwünschte Elemente ausgeschlossen sind.

Das awk-Skript analysiert die Ausgabe der Suche 'ls' und vergleicht die Teilzeichenfolgen, die den Benutzer- und Gruppenberechtigungen entsprechen. Wenn diese gleich sind, werden die Berechtigungen und der Dateiname ausgegeben.

Natürlich können Sie den 'perm'-Teil der print-Anweisung entfernen, um nur die Dateinamen auszugeben, nachdem Sie sie zu Ihrer Zufriedenheit getestet haben.

Lornix
quelle
sieht gut aus, aber ich bevorzuge die Antwort von PleaseStand, weil sie kürzer ist und ich Perl mag
Jayen 18.06.12