Manchmal stelle ich auf alten Linux-Systemen fest, dass Tests , die prüfen, ob die Datei oder das Verzeichnis für den aktuellen Benutzer beschreibbar bzw. lesbar ist, find
nicht unterstützt werden .-writable
-readable
Angenommen, ich möchte ausdrücken -writable
; dann -perm -0002
wäre es nicht gleichwertig, da nicht geprüft wird, ob der Benutzer über Schreibberechtigung mittels Besitzer/Gruppe verfügt.
Wie kann ich find
den -writable
Test von mittels find
anderer Tests von ausdrücken (zB -perm
)?
Antwort1
Es gibt keinen bequemen Weg. Deshalb hat GNU Find hinzugefügt -readable
und Freunde.
Sie können einen Ausdruck erstellen, der dem Berechtigungstest ähnelt, indem Sie die Gruppen aufzählen, denen der Benutzer angehört. Nicht getestet.
can_access="( -user $(id -u) -perm -0${oct}00 -o ("
for g in $(id -G); do
can_access="$can_access -group $g -o"
done
can_access="${can_access% -o} ) -perm -00${oct}0 -o -perm -000${oct} )"
find … $can_access -print
Dies führt in manchen Fällen nicht zum richtigen Ergebnis, beispielsweise wenn Zugriffskontrolllisten vorhanden sind oder in Randfällen, wie etwa wenn -rw----r--
einer Gruppe der Zugriff verweigert werden soll. Sie können die Randfälle mit derselben Technik wie oben prüfen, aber der Ausdruck wird noch komplexer. Für Zugriffskontrolllisten müssen Sie ein Tool aufrufen, das diese unterstützt.
Sprachen wie Perl und Python bieten einfachen Zugriff auf die access(2)
Funktion und Funktionalität von find
. In Perl mitFile::Find
Und-r
/ -w
/-x
(die die effektive UID und GID des Perl-Prozesses verwenden — verwenden Sie -R
/ -W
/, -X
um mit der echten UID/GID wie zu prüfen access(2)
, und verwenden Sie diefiletest 'access'
Pragmawenn Ihr Perl nicht zu alt ist, um Dinge wie ACL zu unterstützen):
use File::Find;
use filetest 'access';
find(sub { if (-r $_) { print "$_ is readable\n"; } }, '.');
In Python mitos.walk
Undos.access
(das die echte UID und GID des Python-Prozesses verwendet, wie etwa access(2)
):
import os
for dirpath, dirnames, filenames in os.walk('.', ):
for filename in filenames:
filename = os.path.join(dirpath, filenames)
if os.access(filename, os.R_OK):
print(filename + ' is readable\n')
Der einzige absolut zuverlässige Weg ist, zu versuchen, die Datei zu öffnen. Dies erfordert ein externes Dienstprogramm und ist daher langsamer. So testen Sie die Lesbarkeit einer regulären Datei:
find … -exec sh -c 'exec 2>/dev/null; : <"$0"' {} \; …
Um die Schreibbarkeit zu testen, verwenden Sie : >>"$0"
(dadurch wird die Datei zum Anhängen geöffnet, sodass es fehlschlägt, wenn die Datei nicht beschreibbar ist, es ändert aber nichts und aktualisiert insbesondere nicht die Änderungszeit). Um die Lesbarkeit eines Verzeichnisses zu testen, verwenden Sie ls -- "$0" >/dev/null
. Um die Ausführbarkeit eines Verzeichnisses zu testen, verwenden Sie cd -- "$0"
. Es gibt keinen passiven Test für die Ausführbarkeit einer regulären Datei, für die Schreibbarkeit eines Verzeichnisses oder für den Zugriff auf die meisten nicht regulären Dateien.