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

Author: Ori, 2009-07-22

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.

 89
Author: paxdiablo,
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.

 27
Author: Stephen C,
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`
 14
Author: Arman H,
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

Via http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed

"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.

 2
Author: b0x0rz,
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 {} +;

 2
Author: ghostdog74,
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