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