Finden Sie alle Dateien und Verzeichnisse, deren Gruppe sich vom Besitzer unterscheidet

474
Jistanidiot

Ich möchte alle Dateien und Verzeichnisse finden, deren Gruppe sich vom Besitzer unterscheidet.

Wenn dies die beiden Dateien im Verzeichnis wären, würde ich einfach die erste finden:

$> ls -l -rw-rw-r--. 1 user175 group192 866 Dec 12 2006 index.htm -rw-r--r--. 1 user175 user175 921 Dec 14 2006 index2.html 

Ich habe mit find gespielt, aber ich fange an zu glauben, dass ich aufgeben und ein Skript schreiben muss (ich würde lieber kein Skript schreiben).

Danke im Voraus.

0
Es gibt Tausende von Verzeichnissen in Linux. Möchten Sie dies wirklich für ** alle ** Verzeichnisse auf Ihrem Computer tun? Oder für bestimmte? Wenn letzteres, dann ist die Aufgabe viel einfacher. Fanatique vor 6 Jahren 0

2 Antworten auf die Frage

1
Kamil Maciorowski
find . -exec sh -c ' stat -c "%U %G" "$1" | awk -F " " "\$1==\$2" ' sh {} \; -print 

Es läuft statfür jedes Objekt und ruft seinen Besitzer und seine Gruppe ab. awkgibt dann den Exit-Status 0nur zurück, wenn sie sich unterscheiden. In der Tat werden nur diese gedruckt.

Anmerkungen:

  • Die Leistung ist gering. Jedes Objekt benötigt ein eigenes sh, statund awk. Ich hatte einige Ideen, um dies zu verbessern ( find . -exec stat … {} + | awk …), aber ich bin nicht sicher, ob ich sie robust genug machen kann, um mit möglichen Dateinamen mit Zeilenumbrüchen usw. arbeiten zu können. Ich entschied mich, auf Nummer sicher zu gehen. Sie können -print0bei Bedarf verwenden. Mit diesem Ansatz können Sie auch weitere Bedingungen hinzufügen find.
  • In meinem Kubuntu stat -c "%U %G"gibt es UNKNOWNUIDs (oder GIDs), die nicht in Namen übersetzt werden können. Wenn es einen Benutzer UNKNOWNoder eine Gruppe gibt UNKNOWN, wird dies stören, denke ich. Ein zurückkehrendes Objekt UNKNOWN UNKNOWNwird naiv interpretiert, um übereinstimmende Besitzer und Gruppen zu haben.
Dies dauert sogar in einem Verzeichnis mit wenigen Dateien ewig, scheint aber in allen Fällen zu funktionieren. Vielen Dank. Jistanidiot vor 6 Jahren 0
0
C0deDaedalus

Nun fand ich eine andere Lösung, die verwendet lsund awkstatt finden. Und das muss und kann sicherlich optimiert werden. Hier kommt's :

ls -alR | awk '{ if ($3 != $4) print $0 }' 

Wie es funktioniert :

  • Sehen Sie, was -alRvon Mann ls tut
  • awk sucht nach dem Muster.
  • $3& $4Gibt entsprechend 3 rd und 4 th Spalte in ls Ausgabe, die sind file ownerund groupdass Besitzer ist ein Teil.
  • $0 gibt die komplette Zeile in ls aus.
  • Bedingung wird if ($3 != $4) print $0interpretiert als "komplette Zeile mit allen Spalten drucken, wobei der Wert in der dritten Spalte nicht dem Wert in der vierten Spalte entspricht"
  • Ein vollständiger Befehl kann als Drucken nur der Zeilen in der Ausgabe von ls interpretiert werden , in denen der Dateiname des Eigentümers und der Gruppenname nicht identisch sind .

Einschränkung:

Manchmal gibt es diesen Fehler für einige Dateien:

ls: cannot open directory './chatscripts': Permission denied 

Soweit ich weiß, handelt es sich um ein Berechtigungsproblem mit dem Benutzer, von dem aus der Befehl ausgeführt wird. Der Benutzer ist weder Eigentümer noch Teil einer Gruppe für diese Datei und kann daher nicht darauf zugreifen.


Was Sie wollen, kann auf jeden Fall mit findcommand erledigt werden, aber ich denke, dass dies auch eine Lösung sein kann und es wird immer noch dieses Berechtigungsproblem geben find.

Fühlen Sie sich frei, um weitere Details hinzuzufügen.

Dies scheint zu funktionieren, bis Sie einen der problematischen Datei- / Verzeichnisnamen treffen, wie in "Warum sollten Sie die Ausgabe von ls nicht parsen". Jistanidiot vor 6 Jahren 0