Почему рекурсивный режим на chmod делает все, кроме рекурсии? - PullRequest
5 голосов
/ 13 августа 2010

chmod -R 775 *.cgi только изменяет права доступа к файлам в текущем каталоге, файлы в подкаталоге не изменяются вообще.Это та же функциональность, что и при выполнении chmod 775 *.cgi.Я видел, как люди используют такие решения, как с find и еще много чего.Хорошо, отлично, но почему режим -R существует, если он ничего не делает?

Ответы [ 5 ]

15 голосов
/ 13 августа 2010

Возможно, потому что у вас нет каталогов с именем *.cgi. руководство :

-R Рекурсивно изменять биты режима файла. Для каждого операнда файла, который называет каталог, chmod должен изменить файл биты режима каталога и все файлы в иерархии файлов под ним.

Например:

$ ls -R
.:
a  a.c  b.c  c.c

./a:
a.c  b.c  sub

./a/sub:
a.c  b.c  
$ chmod -R 444 *.c
$ ls -l
drwxr-xr-x 3 msw msw 4096 2010-08-12 18:07 a
-r--r--r-- 1 msw msw    0 2010-08-12 18:07 a.c
-r--r--r-- 1 msw msw    0 2010-08-12 18:07 b.c
-r--r--r-- 1 msw msw    0 2010-08-12 18:07 c.c
$ : directory a not affected
$ chmod -R u-w a    
$ ls -l a
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 a.c
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 b.c
dr-xr-xr-x 3 msw msw 4096 2010-08-12 18:07 sub
$ ls -l a/sub
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 a.c
-r-xr-xr-x 1 msw msw    0 2010-08-12 18:07 b.c
$ : got em
9 голосов
/ 13 августа 2010

-R указывает chmod перейти в любые каталоги, которые заданы в качестве аргументов.

Если вы скажете chmod -R 775 *.cgi, оболочка развернет *.cgi в список файлов, которые соответствуют этому шаблону, и передаст его в качестве списка аргументов - так что chmod не предлагается искать какие-либо другие каталоги.

( вернется в любой каталог , соответствующий *.cgi ...)

6 голосов
/ 13 августа 2010

Чтобы выполнить то, что вы хотите, попробуйте

find . -name '*.cgi' -print0 | xargs -0 chmod 755

Здесь find генерирует список всех файлов с .cgi, заканчивающимся от текущего каталога вниз, и передает этот список в xargs, который применяет chmod к каждому.

4 голосов
/ 13 августа 2010

*.cgi расширяется вашей оболочкой до списка всех имен файлов в текущем каталоге, заканчивающихся на .cgi. Затем оболочка вызывает chmod с этим списком имен файлов.

chmod просматривает все те имена файлов, которые он получил из оболочки, меняет там режимы и будет повторяться, если некоторые из них будут каталогами. Но, вероятно, ни один из них не является, так что нечего возвращать.

Чтобы найти все файлы cgi в текущем каталоге и его подкаталогах и запустить для них chmod, вы можете сделать:

find . -name '*.cgi' -print0 | xargs -0 chmod 775
2 голосов
/ 13 августа 2010

* - встроенная оболочка, а -R - опция командной строки. Так что chmod никогда не получит * в качестве аргумента.

Поставьте случай, когда foo0.cgi и foo1.cgi являются содержимым каталога. Если вы введете chmod -R o+r *.cgi, то chmod получит '-R', 'o + r', 'foo0.cgi' и 'foo1.cgi' в качестве аргументов.

То, что вы хотите сделать, может быть легко достигнуто:

find . -iname '*.cgi' | xargs chmod 755
...