Frage Wie kann ich chown rekursiv arbeiten lassen?


Ich habe ein Verzeichnis namens pdfs Das enthält eine Reihe von Unter- und Unterverzeichnissen. Ich möchte den Besitz aller PDF-Dateien in allen Unterordnern ändern. Ich habe es gerade versucht:

chown -R someuser:somegroup *.pdf

... aber es änderte nicht den Besitz der PDFs in Unterverzeichnissen. Der Benutzer und die Gruppe existieren.

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

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

Was vermisse ich?


226
2018-03-22 16:29


Ursprung




Antworten:


Der rekursive Modus funktioniert nur bei Verzeichnissen, nicht bei Dateien. Mit der Datei '* .pdf' übergibt die Shell die Dateiliste an chown, das sieht Dateien, und ändert die Berechtigungen für die Dateien, die es sieht, und das war's.

Denken Sie daran, dass der Glob in Shells von der Shell ausgewertet wird, nicht vom Befehl. Wenn der Glob Dateien entspricht, werden sie an den Befehl übergeben und der Befehl weiß nie, dass ein Glob existiert. (Dies ist anders als die Windows-Eingabeaufforderung verwendet, um Dinge zu tun). Wenn Sie ein Verzeichnis haben, mit dem Inhalt so etwas wie:

machine:$ ls -F
file1.pdf  file2.pdf  other.txt  subdir/

Und du hast getippt:

chown -R someuser:somegroup *.pdf

Die Shell würde zuerst die Liste machen: Datei1.pdf Datei2.pdf

und dann führe deinen Befehl aus:

chown -R someuser:somegroup file1.pdf file2.pdf

Sehen Sie, es gibt kein Verzeichnis für -R, um zu handeln. Es tut, was Sie gefragt haben - ändern Sie den Besitz der beiden Dateien in der Befehlszeile und ignorieren Sie diese schrullige -R-Flagge.

Um zu tun, was Sie wollen, verwenden Sie die '* .pdf' als Muster für dieses Verzeichnis und Unterverzeichnisse, die Sie verwenden können find, die Dateien finden können, die mit einem Dateinamenmuster (oder vielen anderen Kriterien) übereinstimmen und an einen Unterbefehl übergeben werden

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

Dies beginnt im aktuellen Verzeichnis '.' nach Dateien (Dateityp f) des Namensmusters suchen '*.pdf' geht dann zu xargs über, das eine Befehlszeile zu chmod aufbaut. Beachten Sie die Anführungszeichen um das Muster herum '*.pdf'Denken Sie daran, dass die Shell, wenn möglich, einen Glob erstellen kann, das Muster jedoch an sie übergeben werden soll find, also müssen Sie es zitieren.

Da Dateinamen in ihnen Leerzeichen enthalten können, möchten Sie einen Trick verwenden, um Dateinamen mit Leerzeichen sicher zu machen:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

In bash 3 und niedriger ist dies die Art, wie Sie es tun müssen. Stärkeres Globbing gibt es in bash 4 (mit shopt -s globstar) und andere Muscheln. Das Gleiche gilt für zsh unter Verwendung eines rekursiven Globs **:

chown -R someuser:somegroup ./**/*.pdf

232
2018-03-22 16:47



Bearbeitet, um diese Bash 4 mit zu reflektieren shopt -s globstar rekursives Globbing. - kojiro
@kojiro danke! Wie du sehen kannst, benutze ich immer noch bash3 - Rich Homolka
Auf der Man-Seite, die auf dem Original-Poster zu sehen war, fand ich heraus, dass der ch-r tatsächlich den Besitzer für Ordner und Dateien änderte. Keine Notwendigkeit zu finden. Verwenden von Mint 15. - gwideman
@gwideman Ich weiß, das ist alt ... Aber ja, natürlich -R tut rekursiv. Das OP hatte gerade ein Problem mit einer sehr spezifischen Art von Rekursion, eine Erweiterung und "Dateityp ist Datei" gefiltert - Rich Homolka
@RichHomolka Ah. OP sagte, dass die Dateien in einem Verzeichnis mit dem Namen "pdfs" waren, also nahm ich an, dass das Problem darin bestand, PDFs als zu rekursierendes Verzeichnis zu spezifizieren, und dass alle enthaltenen Dateien pdfs waren, so dass sie nicht speziell ausgewählt werden mussten. Aber Sie haben vielleicht Recht, wenn Sie nur PDF-Dateien auswählen und andere unverändert lassen wollen. - gwideman


Es ist nicht kompliziert.

chown -R someuser:somegroup /your/folder/here/*

Dies gilt für alle Dateien und alle Unterverzeichnisse und Unterverzeichnisse des angegebenen Ordners. Verwenden Sie vorsichtig.


29
2017-11-09 11:44



Offensichtlich antwortet jemand seit 4 Jahren, aber ty für die Warnung. - Francisco Tapia
Diese Frage befindet sich derzeit bei Google auf Platz 1, daher ist es wichtig, die richtige Antwort zu notieren. - Sprachprofi
Sicher, der Akzeptierte ist eleganter, lesbarer und vollständiger - Francisco Tapia
Irgendwie sudo chown -R user ./ hat für mich gearbeitet, aber sudo chown -R user ./* nicht - Slav
Ich weiß, das ist alt, aber obwohl dies die Überschrift beantwortet, beantwortet die Frage nicht. Das ist tatsächlich etwas schlechter als das, was OP bereits versucht hat. - Rich Homolka


Du kannst den ... benutzen find Nützlichkeit:

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

Bitte nicht die Anführungszeichen vergessen *.pdf. Andernfalls versucht die Shell, sie zu erweitern. Dies bedeutet, dass bereits die Shell ersetzt wird *.pdf mit den Namen aller PDF-Dateien im aktuellen Verzeichnis. Aber das ist nicht was du willst. Sie möchten die PDF-Dateien in Unterverzeichnissen finden. Bt .: Das ist auch das Problem mit Ihrem chown Befehl.


14
2018-03-22 16:37



Ich musste nachsehen +, ordentlicher Trick für die Leistung. -exec command {} + Diese Variante der Aktion -exec führt den angegebenen Befehl für die ausgewählten Dateien aus, aber die Befehlszeile wird erstellt, indem jeder ausgewählte Dateiname am Ende angehängt wird. Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile ist ähnlich aufgebaut wie die Befehlszeile xargs Erstellt seine Befehlszeilen. Nur eine Instanz von {} ist innerhalb des Befehls erlaubt. Der Befehl wird im Startverzeichnis ausgeführt. - Patrick M
@PatrickM ein (kleiner) anderer Vorteil zu + vs; .... plus ist kein Shell-Meta-Zeichen und muss nicht maskiert werden - Rich Homolka


Der Befehl

chown -R someuser:somegroup *.pdf

rekursiert nur Verzeichnisse, wenn der Verzeichnis Name endet in .pdf. Du brauchst etwas wie:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

6
2018-03-22 16:38



Technisch wird es nur eine Ebene tiefer gehen. ob Sie diese echte Rekursion nennen oder nicht, ist eine Übung für den Benutzer :) - Rich Homolka


Um den Besitz eines Verzeichnisses rekursiv zu ändern, benutzen Sie einfach:

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

hier username = der neue Benutzer, der Besitzer des Verzeichnisses sein soll

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

Jede Datei / jedes Verzeichnis hat einen Benutzerbesitzer und einen Gruppenbesitzer


0
2018-05-11 01:38



Das tut nicht, was das OP gefragt hat. Dies ändert den Besitz von allem, OP fragte nach einem bestimmten Satz von Dateien. - Rich Homolka


ich benutze tree stattdessen:

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

Achten Sie auch darauf, rekursive chown oder chmod nicht im Verzeichnis '/' oder einem anderen Systemverzeichnis auszuführen.


0
2018-01-25 13:36