zmiana chmod dla plików, ale nie katalogów
Muszę użyć chmod, aby zmienić wszystkie pliki rekurencyjnie na 664. Chciałbym pominąć teczki. Myślałem o zrobieniu czegoś takiego
ls -lR | grep ^-r | chmod 664
To nie działa, zakładam, że ponieważ nie mogę podłączyć do chmod Zna ktoś łatwy sposób na to?
Thanks
5 answers
A find -exec
Odpowiedź jest dobra, ale cierpi na Zwykle nieistotne niedociągnięcia, że tworzy osobny pod-proces dla każdego pojedynczego pliku. Jednak jest to doskonale funkcjonalne i będzie działać źle tylko wtedy, gdy liczba plików staje się naprawdę duża. Użycie {[2] } spowoduje podział nazw plików na duże grupy przed uruchomieniem podprocesu dla tej grupy plików.
Musisz tylko uważać, aby używając xargs
poprawnie obsługiwać nazwy plików z osadzone w nich spacje, znaki nowego wiersza lub inne znaki specjalne.
Rozwiązaniem, które rozwiązuje oba te problemy jest (zakładając, że masz wystarczająco przyzwoitą implementację find
i xargs
):
find . -type f -print0 | xargs -0 chmod 644
-print0
powoduje, że find
Kończy nazwy plików w strumieniu wyjściowym znakiem NUL (a nie spacją), a -0
do xargs
informuje, że powinien tego oczekiwać jako format wejściowy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-21 00:41:55
Innym sposobem jest użycie find ... -exec ...
w następujący sposób:
find . -type f -exec chmod 644 {} \;
Problem polega na tym, że -exec
uruchamia chmod
proces dla każdego pliku. Podejście xargs
unika tego i jest lepsze pod warunkiem, że masz wersję find
i xargs
, która poradzi sobie z problemem" spacje w nazwach ścieżek"; zobacz akceptowaną odpowiedź.
I dla tego rekordu, użycie back-Tick ' ów spowoduje złamanie, jeśli jest zbyt wiele plików do chmodowania, lub zagregowana długość ścieżek jest zbyt duża.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 00:45:20
Moje zwięzłe dwa centy...
Linux:
$ chmod 644 `find -type f`
OSX:
$ chmod 644 `find . -type f`
Działa to rekurencyjnie zmieniając wszystkie pliki zawarte w bieżącym katalogu i wszystkie jego podkatalogi. Jeśli chcesz wybrać inny katalog, zastąp .
poprawną ścieżką:
$ chmod 644 `find /home/my/special/folder -type f`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-27 02:00:59
"znajdź . - type f-print / xargs chmod 444 " shoud praca, prawda ? Jeśli nie, Znajdź . - Drukuj >myfile.sh i vi myfile.sh usuwanie katalogów (nie powinno ich być zbyt wiele), a następnie 1,$s / ^ / chmod 444/ i sh myfile.sh.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 06:01:12
Z GNU find
find /path -type f -exec chmod 644 {} +;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-20 14:46:29