Jak mogę chmod / chown konkretną listę plików?

31

Chcę napisać skrypt .sh, aby skonfigurować uprawnienia do folderów, ale zastanawiałem się, czy mogę uruchomić coś takiego:

chown -644 ./one;/two;/three

aby wyświetlić listę folderów, zamiast wywoływać chown wiele razy.

Czy byłby też sposób na przejrzenie listy plików i wykluczenie niektórych innych, takich jak na przykład:

chown -R -664 ./*;!./cache

Mam nadzieję, że moje pseudo-wiersze poleceń będą miały sens.

josef.van.niekerk
źródło

Odpowiedzi:

43

Prawie wszystkie narzędzia uniksowe akceptują listę plików jako argumenty niebędące opcjami. Jak zwykle różne argumenty muszą być oddzielone spacją:

chown 644 one two three

W drugim przykładzie, jeśli używasz Bash, prosty

chown -R 644 !(cache)

to wystarczy.

To podejście wymaga rozszerzonego dopasowania wzorca. Jeśli jest wyłączone, możesz je włączyć za pomocą

shopt -s extglob

Patrz: Podręcznik Bash # Dopasowywanie wzorców

Dennis
źródło
4

Zrób listę nazw plików w mod-these.txt, a następnie uruchom:

chmod g+w `cat mod-these.txt`

lub użyj metody opisanej przez innych tutaj:

chown 644 one two three

lub przejdź do miasta z pierwszą opcją, ale manipuluj każdą linią w pliku (w tym przykładzie: zamień „/” (Z białymi wcześniej) na „./”):

chmod g+w `sed 's/ \// .\//' update-writable.txt` 
Chonez
źródło
2

regex dla wygranej!

użycie find jest najlepszym sposobem, jaki mogę wymyślić poza użyciem wyrażenia regularnego, które może już istnieć w konkretnej powłoce lub w aplikacji, której używasz. najpierw próbowałem:

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

Ale przekonasz się, że rura nie działa w tym przypadku. Kolejna smutna rzecz do nauczenia się ... jak nauka chmod, chown, chgrp, et. glin. nie obsługuje samego wyboru / wykluczenia wielu plików / wyrażenia regularnego ...
Rozwiązanie, które znalazłem:
/programming/19111067/regex-match-either-string-in-linux-find-command

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

więc nie tyle regex dla wygranej, ale przynajmniej mamy sposób na wstrzyknięcie listy plików do argumentów programu w jednym wierszu.

zauważysz, że musisz uciec od meta-znaków () i dodać parametr -o dla każdej dodatkowej nazwy ...

inne linki i treści ode mnie, które mogą Cię zainteresować podczas podróży:
Różne ciekawostki - notatki od Korn Bourne i przyjaciół. - Strona internetowa Dave'a Hornera

Twoje zdrowie.
--dave

Dave Horner
źródło
KISS wygrywa, niech to będzie proste i głupie! nie ma potrzeby komplikowania rzeczy, które wciąż mogą być czyste i łatwe.
Al-Mothafar,
2

Jeśli pliki, które chcesz zmodyfikować, znajdują się w jednym katalogu, możesz je pobrać z wymaganym wzorcem.

np. potrzebuję wszystkich pobranych plików .run w pwd, aby zmienić je na plik wykonywalny:

chmod +x `ls *.run`
gat1
źródło