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

Jak mogę sprawić, że chown będzie działać cyklicznie?

Mam katalog o nazwie pdfs, który zawiera kilka podkatalogów i pod-katalogów. Chcę zmienić własność wszystkich plików PDF we wszystkich podfolderach. Właśnie próbowałem tego:

chown -R someuser:somegroup *.pdf

…ale nie zmieniło to własności plików PDF w podkatalogach. Użytkownik i grupa istnieją.

Zgodnie ze stroną man dla chown, -R powinno oznaczać rekurencyjne:

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

Czego mi brakuje?

Odpowiedzi (7)

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

Tryb powtarzalny działa tylko na katalogi, nie na pliki. Używając globu ‘*.pdf’ powłoka przekazuje listę plików do chown, który widzi, że są to pliki, i zmienia uprawnienia na pliki, które widzi, i to wszystko.

Pamiętaj, w powłokach, glob jest oceniany przez powłokę, a nie przez polecenie. Jeżeli glob pasuje do plików, jest przekazywany do polecenia i polecenie nigdy nie wie, że glob istnieje. (Jest to coś innego niż to, czego używano do robienia rzeczy w wierszu poleceń Windows). Jeśli masz dir, z zawartością czegoś w rodzaju:

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

I wpisałeś:

chown -R someuser:somegroup *.pdf

Powłoka najpierw zrobiłaby listę: file1.pdf file2.pdf

, a następnie uruchomiła komendę:

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

Zobacz, nie ma katalogu dla -R do działania. Robi on to, o co go poprosiłeś - zmienia własność dwóch plików w linii poleceń, ignorując tę dziwaczną flagę -R.

Aby zrobić to, co chcesz, użyj ‘*. pdf’ jako wzorzec dla tego katalogu i podkatalogów, możesz użyć find, który może znaleźć pliki pasujące do wzorca nazwy pliku (lub wielu innych kryształów) i przekazać do podkatalogu

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

Rozpoczyna się to w bieżącym dir ‘.’ aby szukać plików (typu pliku f) o nazwie wzorzec '*.pdf', a następnie przechodzi do xargs, który konstruuje linię poleceń do chmod. Zauważ cytaty wokół wzoru '*.pdf', pamiętaj, że powłoka utworzy globus, jeśli może, ale chcesz, aby wzór został przekazany do find, więc musisz go zacytować.

Ponieważ nazwy plików mogą mieć w sobie spacje, chcesz użyć sztuczki, aby uczynić go plikiem bezpiecznym-z-przestrzenią:

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

W bashu 3 i niższych, tak właśnie musisz to zrobić. Mocniejsze globusy dostępne są w bash 4 (z shopt -s globstar) i innych muszlach. To samo w zsh, przy użyciu rekurencyjnej kuli ziemskiej **:

chown -R someuser:somegroup ./**/*.pdf
57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

Dotyczy to wszystkich plików oraz wszystkich podkatalogów i podkatalogów określonego folderu. Używaj ostrożnie.

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

Możesz użyć narzędzia find:

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

Proszę nie zapomnij cytatów wokół *.pdf. W przeciwnym razie powłoka będzie próbowała ją rozszerzyć. Oznacza to, że już teraz powłoka zastąpi *.pdf nazwami wszystkich plików PDF znajdujących się w bieżącym katalogu. Ale nie tego chcesz. Chcesz znaleźć pliki PDF znajdujące się w podkatalogach. Btw..: To też jest problem z twoją komendą chown.

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

Polecenie

chown -R someuser:somegroup *.pdf

będzie powtarzać się w dół katalogów tylko wtedy, gdy nazwa directory zakończy się na .pdf. Potrzebujesz czegoś w rodzaju:

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

aby zmienić własność katalogu rekurencyjnie wystarczy użyć:

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

tutaj username = nowy użytkownik, który powinien być właścicielem katalogu

groupname = 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

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

Używam zamiast tego tree:

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

Zwróć również uwagę, aby nie uruchamiać rekurencyjnego chown lub chmod w katalogu ‘/’ lub innym katalogu systemowym.

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

Aby stać się właścicielem wszystkich plików w katalogu, użyj

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

zamiast

sudo chown $USER directory\*

lub

sudo chown --recursive $USER directory

, które mogą nie działać, jeśli jest zbyt wiele argumentów stworzonych przez * (zbyt wiele plików w katalogu) lub które nie robią odpowiednio tego, co chcesz.