Der rekursive Modus funktioniert nur für Verzeichnisse, nicht für Dateien. Durch die Verwendung des Globus '* .pdf' übergibt die Shell die Dateiliste an chown, die erkennt, dass es sich um Dateien handelt, und ändert die Berechtigungen für die angezeigten Dateien.
Denken Sie daran, dass in Shells der Glob von der Shell und nicht vom Befehl ausgewertet wird. Wenn der Glob mit Dateien übereinstimmt, werden sie an den Befehl übergeben, und der Befehl weiß nie, dass ein Glob vorhanden ist. (Dies unterscheidet sich von der Windows-Eingabeaufforderung). Wenn Sie ein Verzeichnis haben, mit dem Inhalt etwas 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 erstellen: file1.pdf file2.pdf
und dann führe deinen Befehl aus:
chown -R someuser:somegroup file1.pdf file2.pdf
Es gibt kein Verzeichnis, in dem -R aktiv sein könnte. Es macht, was Sie es gefragt haben - ändern Sie den Besitz für die beiden Dateien in der Befehlszeile und ignorieren Sie das skurrile -R-Flag.
Um das zu tun, was Sie möchten, können Sie das '* .pdf' als Muster für dieses Verzeichnis und die Unterverzeichnisse verwenden find
, um Dateien zu finden, die einem Dateinamenmuster (oder vielen anderen Kriterien) entsprechen und an einen Unterbefehl übergeben werden
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Dies beginnt in der aktuellen Richtung '.' Das Suchen nach Dateien (Dateityp f) mit dem Namen pattern wird '*.pdf'
dann an xargs übergeben, das eine Befehlszeile für chmod erstellt. Beachten Sie die Anführungszeichen um das Muster. '*.pdf'
Denken Sie daran, dass die Shell ein Glob erstellt, wenn dies möglich ist. Sie möchten jedoch, dass das Muster übergeben wird, find
und müssen es daher in Anführungszeichen setzen.
Da Dateinamen Leerzeichen enthalten können, möchten Sie einen Trick anwenden, 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 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 in zsh mit einem rekursiven Glob **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
rekursivem Globbing widerzuspiegeln .Dies gilt für alle Dateien und alle Unterverzeichnisse und Unterverzeichnisse des angegebenen Ordners. Mit Vorsicht verwenden.
quelle
sudo chown -R user ./
hat es für mich funktioniert, abersudo chown -R user ./*
nicht.env
.Sie können das
find
Dienstprogramm verwenden:Bitte vergessen Sie die Anführungszeichen nicht
*.pdf
. Andernfalls versucht die Shell, sie zu erweitern. Dies bedeutet, dass die Shell bereits durch*.pdf
die Namen aller PDF-Dateien im aktuellen Verzeichnis ersetzt wird. Aber das ist nicht was du willst. Sie möchten die PDF-Dateien in Unterverzeichnissen finden. Übrigens: Das ist auch das Problem mit Ihremchown
Befehl.quelle
+
netten Trick nachschlagen , um Leistung zu erzielen.-exec command {} +
Diese Variante der Aktion -exec führt den angegebenen Befehl für die ausgewählten Dateien aus. Die Befehlszeile wird jedoch 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 in etwa so aufgebaut wie diexargs
Befehlszeilen.{}
Innerhalb des Befehls ist nur eine Instanz von zulässig. Der Befehl wird im Startverzeichnis ausgeführt.Der Befehl
Verzeichnisse werden nur dann wiederhergestellt, wenn der Verzeichnisname auf .pdf endet. Sie brauchen etwas wie:
quelle
Um den Besitz eines Verzeichnisses rekursiv zu ändern, verwenden Sie einfach:
hier Benutzername = der neue Benutzer, der Eigentümer des Verzeichnisses sein soll
Gruppenname = Die neue Gruppe, die Eigentümer des Verzeichnisses sein soll
Jede Datei / jedes Verzeichnis hat einen Benutzer- und einen Gruppenbesitzer
quelle
Ich benutze
tree
stattdessen:Achten Sie auch darauf, dass Sie nicht rekursiv chown oder chmod im Verzeichnis '/' oder einem anderen Systemverzeichnis ausführen.
quelle
Verwenden Sie, um Eigentümer aller Dateien in einem Verzeichnis zu werden
Anstatt von
oder
Was möglicherweise nicht funktioniert, wenn zu viele Argumente von * (zu viele Dateien im Verzeichnis) erzeugt werden oder wenn nicht das getan wird, was Sie wollen.
quelle