Jak zmienić / chmod wszystkie pliki w bieżącym katalogu?


56

Usiłuję zmienić własność i uprawnienia niektórych plików (i katalogów) w bieżącym katalogu. Próbowałem tego:

chown username:groupname .

... spodziewając się, że wpłynie to na wszystkie pliki w bieżącym katalogu, ale zamiast tego wpłynie tylko na katalog, w którym się znajduję (co jest przeciwieństwem tego, co chcę zrobić). Chcę to zmienić we wszystkich plikach bez wpływu na bieżący katalog, w którym się znajduję.

Jak mogę przeglądać i przesyłać wszystkie pliki w bieżącym katalogu?


man chowni man chmodłatwo odpowiedz na twoje pytanie.
Shi

2
@Shi Myślę, że to uczciwe pytanie. Czytanie tej strony podręcznika nie pomogłoby. Globbing nie jest częścią chmod. Jest wbudowany w powłokę. Również czytanie dokumentacji na temat globowania wysysa z ciebie życie (spędziłem dużo czasu, zastanawiając się nad wszystkimi funkcjami zsh).
djf

1
@djf:chown -R user:group .
Shi

Odpowiedzi:


96

Chcesz użyć chown username:groupname *i pozwól powłoce rozwinąć *zawartość do bieżącego katalogu. Spowoduje to zmianę uprawnień do wszystkich plików / folderów w bieżącym katalogu, ale nie do zawartości folderów.

Możesz również to zrobić chown -R username:groupname ., co zmieni uprawnienia w bieżącym katalogu, a następnie wróci do niego i wszystkich podfolderów, aby zmienić uprawnienia.

chown -R username:groupname *zmieni rekursywnie uprawnienia do wszystkich plików i folderów, pozostawiając sam katalog bieżący sam. Najczęściej używam tego i pierwszego stylu.


2
@Andrew Bądźcie jednak czujni, może być zarówno przyjacielem, jak i wrogiem zmęczonym lub nieprzygotowanym.
Darth Android

5
Uważaj też na niebezpieczeństwa tego okresu. Ponieważ jest umieszczony tuż przy klawiszu „/” na klawiaturze. Prosta literówka może łatwo zmienić się chown -R username:groupname .w chown -R username:groupname /. Zrobienie 2-sekundowego zadania koszmarem 2-dniowym.
teynon

@Tom Dlatego prawdopodobnie powinienem zacząć korzystać -vze wszystkich moich rekurencyjnych poleceń, ale zbyt leniwy
Kanion Kolob

Po prostu głosowałem jako najlepszą i najbardziej zwięzłą odpowiedź, chociaż byłbym konkretny i nazwałbym katalog, aby uniknąć poślizgu klawiatury:chown -R username:groupname directoryname
Dave Everitt

9

Myślę, że chcesz tego:

chown username:groupname *

Jeśli chcesz również rekurencyjnie zmieniać podkatalogi, potrzebujesz przełącznika -R( -rjest przestarzały):

chown -R username:groupname *


0

chownjest świetny, jeśli jesteś superużytkownikiem. Miałem problem makepolegający na tym, że ktoś inny działał w moim katalogu, a teraz posiadałem niektóre pliki, których nie mogłem modyfikować. Oto moje obejście, które obsługuje pliki i katalogi, chociaż pozostawia katalogi z sufiksem, .mkmeownerjeśli nie można ich usunąć.

  • Poniższy skrypt zmienia własność plików i katalogów przekazanych mu przez właściciela, próbując obejść problemy z uprawnieniami, tworząc nową kopię każdego katalogu lub pliku, który nie jest własnością bieżącego użytkownika, usuwając (lub próbując usunąć) oryginalny plik i odpowiednio zmieniając jego nazwę.
  • Chodzi o to, aby był to skrót od słowa „uczyń mnie właścicielem”. Nie używam podkreślników, ponieważ pisanie ich jest uciążliwe.

Przykłady:

% mkmeowner .

% mkmeowner dirpath1 dirpath2
  • Wymaga następującego skryptu, mkmeowneroneaby był na twojej drodze.

mkmeowner:

#!/bin/bash
[ "x$1" == "x-h" ] || [ "x$1" == "x--help" ] && cat << END && exit 0
Usage: $0 dirorfile [direorfile2 ...]:
    change ownership of directories or files to current user.
    Current user must have permissions to read those and write to owner directory.
END
mkmeownerone=`which mkmeownerone`
for d in $*; do
    find "$d" -not -user `whoami` -exec $mkmeownerone {} \;
done

mkmeownerone:

#!/bin/bash
# change ownership of one file or directory
f="$1"
expr match "${f}" '.*\.mkmeowner$' > /dev/null && exit 1 # already tried to do this one
if mv -f "$f" "${f}.mkmeowner"; then
    cp -pr "${f}.mkmeowner" "$f" && rm -rf "${f}.mkmeowner"
    exit 0
fi
exit 1

1
(1) Wolimy odpowiedzi zawierające wyjaśnienia. Byłem zaskoczony, kiedy czytałem wasze scenariusze i widziałem, co oni zrobili, ponieważ twój wstępny akapit nie dał mi pojęcia. (2) Zapomniałeś wspomnieć, że użytkownik musi wprowadzić mkmeowneroneścieżkę wyszukiwania.  mkmeownerwybuchnie, jeśli nie zostanie to zrobione. (3) Dowiedz się, jak (tj. Kiedy i gdzie) używać cudzysłowów w poleceniach i skryptach powłoki. Mówienie ${f}nie jest użyteczną alternatywą; zobacz to . … (Ciąg dalszy)
Scott

(Ciąg dalszy)… (4) Jeśli uruchomisz skrypt w katalogu, potencjalnie skopiuje on każdy plik w tym katalogu dwa razy. (5)  exprjest przestarzały. Bardziej efektywne jest wykonywanie prostych dopasowań ciągów w powłoce; bash obsługuje również dopasowanie wyrażeń regularnych. W tym przypadku możesz wykonać test nazwy pliku w find. (6). Twoje expr matchpolecenie sprawdza, czy ${f}kończy się na mkmeowner, a nie na końcu .mkmeowner. Dlatego skrypt nie będzie działał na sobie. ... (ciąg dalszy)
Scott

(Ciąg dalszy)… Prawdopodobnie jest to dobra rzecz - nie chcesz się ruszać i potencjalnie usuwać skrypt podczas jego działania. (Niekoniecznie spowoduje to problem, ale może być nieuporządkowany.) Ale powinieneś zrozumieć (i udokumentować) takie przypadki szczególne. (7) Możesz chcieć używać podkreślników w ciągach wielu słów.  dirorfilejest trudny do odczytania i zrozumienia (porównaj z dir_or_file), a kiedy zobaczyłem mkmeowner, moją pierwszą myślą był kot ( mk +  meow +  ner).
Scott

Dzięki za notatki Scott. 1. Myślałem, że mam wyjaśnienie, ale pozwólcie, że wyrażę się bardziej precyzyjnie. 2. dobra uwaga. Uchwyciłem to w moim oryginalnym skrypcie, ale wyjąłem odniesienie. 3. Piszę skrypty powłoki od 30 lat, ale na pewno postaram się dowiedzieć więcej. 4. Tak. Celowo, ponieważ jeśli nie jestem właścicielem katalogu, nie mogę go usunąć. Mogę o tym wspomnieć. 5. Tak, jestem staroświecki, ale expr nadal działa całkiem dobrze 6. ha dobry punkt. 7. Mogę, jak sądzę, uzyskać licencję artystyczną, ponieważ podkreślenia nie są regułą. Potrzebuję skryptu miauczącego!
sbcondor

Nie wydaje mi się, żeby z $ {f} było coś nie tak, prawda? To tylko trochę dłużej niż to konieczne. Jest to format, którego często używam, ponieważ mogę chcieć użyć zmiennej do utworzenia dłuższego łańcucha, takiego jak $ {f} .mkmeowner, i nie muszę pamiętać, czy $ f.heck oznacza $ {f} + heck czy $ { f.heck}
sbcondor
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.