Tryb rekurencyjny działa tylko na katalogach, a nie na plikach. Używając glob '* .pdf', powłoka przekazuje listę plików do chown, która widzi, że są to pliki i zmienia uprawnienia do plików, które widzi, i to wszystko.
Pamiętaj, że w powłokach glob jest oceniany przez powłokę, a nie przez polecenie. Jeśli glob pasuje do plików, są one przekazywane do polecenia i polecenie nigdy nie wie, że glob istnieje. (Różni się to od tego, w jaki sposób wiersz poleceń systemu Windows służył do wykonywania różnych czynności). Jeśli masz katalog, z treścią coś takiego:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
I wpisałeś:
chown -R someuser:somegroup *.pdf
Najpierw powłoka utworzy listę: plik1.pdf plik2.pdf
a następnie uruchom polecenie:
chown -R someuser:somegroup file1.pdf file2.pdf
Widzisz, nie ma katalogu dla -R do działania. Robi to, o co go prosiłeś - zmienia prawa własności do dwóch plików w wierszu poleceń, ignorując tę dziwaczną flagę -R.
Aby zrobić, co chcesz, użyj „* .pdf” jako wzorca dla tego katalogu i podkatalogów, możesz użyć find
, który może znaleźć pliki, które pasują do wzorca nazwy pliku (lub wielu innych kryteriów) i przekazać do podkomendy
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
To zaczyna się w aktualnym reż. aby wyszukać pliki (typ pliku f) wzorzec nazwy, '*.pdf'
a następnie przechodzi do xargs, który konstruuje linię poleceń do chmod. Zwróć uwagę na cytaty wokół wzorca '*.pdf'
, pamiętaj, że powłoka utworzy glob, jeśli to możliwe, ale chcesz przekazać wzór find
, więc musisz go zacytować.
Ponieważ w nazwach plików mogą znajdować się spacje, należy zastosować sztuczkę, aby zapewnić bezpieczeństwo nazw plików ze spacjami:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
W bash 3 i niższych jest to sposób, w jaki musisz to zrobić. Bardziej zaawansowane globowanie jest dostępne w bash 4 (with shopt -s globstar
) i innych powłokach. To samo w przypadku Zsh przy użyciu rekurencyjnego globu **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
rekursywnym globowaniem.Spowoduje to zastosowanie chown do wszystkich plików i wszystkich podkatalogów i podkatalogów określonego folderu. Używaj ostrożnie.
źródło
sudo chown -R user ./
dla mnie działało, alesudo chown -R user ./*
nie.env
.Możesz użyć
find
narzędzia:Proszę nie zapomnieć o cytatach
*.pdf
. W przeciwnym razie powłoka spróbuje ją rozwinąć. Oznacza to, że już powłoka zastąpi*.pdf
nazwy wszystkich plików PDF znalezionych w bieżącym katalogu. Ale nie tego chcesz. Chcesz znaleźć pliki PDF znajdujące się w podkatalogach. Przy okazji: to też jest problem z twojąchown
komendą.źródło
+
zgrabną sztuczkę pod kątem wydajności.-exec command {} +
Ten wariant akcji -exec uruchamia określone polecenie na wybranych plikach, ale linia poleceń jest budowana przez dołączenie każdej wybranej nazwy pliku na końcu; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba dopasowanych plików. Wiersz poleceń jest budowany w taki sam sposób, jakxargs
wiersze poleceń.{}
W poleceniu dozwolona jest tylko jedna instancja Polecenie jest wykonywane w katalogu startowym.Komenda
będzie ponownie wyświetlać katalogi tylko wtedy, gdy nazwa katalogu kończy się na .pdf. Potrzebujesz czegoś takiego:
źródło
aby zmienić własność katalogu rekurencyjnie, po prostu użyj:
tutaj nazwa użytkownika = nowy użytkownik, który powinien być właścicielem katalogu
nazwa grupy = nowa grupa, która powinna być właścicielem katalogu
każdy plik / katalog ma właściciela użytkownika i właściciela grupy
źródło
Używam
tree
zamiast tego:Uważaj również, aby nie uruchamiać rekurencyjnego chown lub chmod w katalogu „/” lub innym katalogu systemowym.
źródło
Aby stać się właścicielem wszystkich plików w katalogu, użyj
zamiast
lub
co może nie działać, jeśli * jest zbyt wiele argumentów (zbyt wiele plików w katalogu) lub które nie robią tego, co chcesz.
źródło