Der rekursive Modus funktioniert nur bei Verzeichnissen, nicht bei Dateien. Durch die Verwendung des glob ‘*.pdf’ übergibt die Shell die Dateiliste an chown, der sieht, dass es sich um Dateien handelt, und ändert die Zugriffsrechte auf die Dateien, die er sieht, und das war’s.
Denken Sie daran, dass in Shells der glob von der Shell ausgewertet wird, nicht vom Befehl. Wenn der Glob mit Dateien übereinstimmt, werden sie an den Befehl übergeben, und der Befehl weiß nie, dass ein Glob existiert. (Dies unterscheidet sich von der Windows-Eingabeaufforderung, wie sie früher verwendet wurde, um Dinge zu tun). Wenn Sie ein Verzeichnis haben, mit einem Inhalt wie:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
Und Sie tippten:
chown -R someuser:somegroup *.pdf
Die Shell würde zuerst die Liste: file1.pdf file2.pdf
erstellen und dann Ihren Befehl ausführen:
chown -R someuser:somegroup file1.pdf file2.pdf
Sehen Sie, es gibt kein Verzeichnis für -R, um darauf zu reagieren. Es tut, worum Sie es gebeten haben - ändern Sie den Besitzer der beiden Dateien auf der Befehlszeile und ignorieren Sie das schrullige -R-Flag.
Um zu tun, was Sie wollen, benutzen Sie das ‘*. pdf’ als Muster für dieses Verzeichnis und die Unterverzeichnisse zu verwenden, können Sie find
verwenden, das Dateien finden kann, die einem Dateinamensmuster (oder vielen anderen Kriterien) entsprechen, und an einen Unterbefehl übergeben
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Dies beginnt im aktuellen Verzeichnis ‘.’, um nach Dateien (Dateityp f) des Namensmusters zu suchen '*.pdf'
wird dann an xargs übergeben, das eine Befehlszeile an chmod konstruiert. Beachten Sie die Anführungszeichen um das Muster '*.pdf'
, denken Sie daran, dass die Shell einen Glob erzeugt, wenn sie kann, aber Sie möchten, dass das Muster an find
übergeben wird, also müssen Sie es in Anführungszeichen setzen.
Da Dateinamen Leerzeichen enthalten können, möchten Sie einen Trick anwenden, um es Dateinamen-mit-Leerzeichen sicher zu machen:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
In der Bash 3 und darunter ist dies die Art und Weise, wie Sie es tun müssen. Stärkeres Globbing ist in bash 4 (mit shopt -s globstar
) und anderen Shells verfügbar. Dasselbe gilt für zsh mit einem rekursiven glob **
:
chown -R someuser:somegroup ./**/*.pdf