2011-03-22 16:29:12 +0000 2011-03-22 16:29:12 +0000
308
308

Wie kann ich chown rekursiv arbeiten lassen?

Ich habe ein Verzeichnis namens pdfs, das eine Reihe von Unter- und Unter-Unterverzeichnissen enthält. Ich möchte die Eigentümerschaft für alle PDF-Dateien in allen Unterordnern ändern. Ich habe gerade folgendes versucht:

chown -R someuser:somegroup *.pdf

…aber es hat den Besitzer der PDF-Dateien in den Unterverzeichnissen nicht geändert. Der Benutzer und die Gruppe existieren.

Laut der Manpage für chown sollte -R rekursiv bedeuten:

-R, --recursive
          operate on files and directories recursively

Was fehlt mir?

Antworten (7)

315
315
315
2011-03-22 16:47:32 +0000

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
57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

Dies gilt für alle Dateien und alle Unterverzeichnisse und Unterunterverzeichnisse des angegebenen Ordners. Mit Vorsicht verwenden.

14
14
14
2011-03-22 16:37:41 +0000

Sie können das Hilfsprogramm find verwenden:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

Bitte vergessen Sie die Zitate um *.pdf nicht. Andernfalls wird die Shell versuchen, sie zu erweitern. Das bedeutet, dass die Shell bereits *.pdf durch die Namen aller PDF-Dateien ersetzt, die sich im aktuellen Verzeichnis befinden. Aber das ist nicht das, was Sie wollen. Sie wollen die PDF-Dateien finden, die sich in Unterverzeichnissen befinden. Übrigens..: Das ist auch das Problem mit Ihrem chown-Befehl.

6
6
6
2011-03-22 16:38:07 +0000

Der Befehl

chown -R someuser:somegroup *.pdf

rekurriert Verzeichnisse nur dann nach unten, wenn der Name des Verzeichnisses auf .pdf endet. Sie benötigen etwas wie:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;
1
1
1
2016-05-11 01:38:58 +0000

um den Eigentümer eines Verzeichnisses rekursiv zu ändern, verwenden Sie einfach:

sudo chown -R <username>:<groupname> <dir name>

hier Benutzername = der neue Benutzer, der Eigentümer des Verzeichnisses sein sollte

Gruppenname = die neue Gruppe, die Eigentümer des Verzeichnisses sein sollte

jede Datei/jedes Verzeichnis hat einen Benutzer- und einen Gruppeneigentümer

0
0
0
2018-01-25 13:36:51 +0000

Ich verwende stattdessen tree:

sudo tree -fai ~/.blabla | xargs -L1 -I{} sudo chown youruser:youruser {}

Achten Sie auch darauf, keine rekursiven chown oder chmod im Verzeichnis ‘/’ oder einem anderen Systemverzeichnis auszuführen.

0
0
0
2019-01-29 20:22:33 +0000

Um Eigentümer aller Dateien in einem Verzeichnis zu werden, verwenden Sie

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

statt

sudo chown $USER directory\*

oder

sudo chown --recursive $USER directory

, was möglicherweise nicht funktioniert, wenn zu viele Argumente durch * (zu viele Dateien im Verzeichnis) erzeugt werden, bzw. nicht das tut, was Sie wollen.