2010-08-12 71 views
3

chmod -R 775 *.cgi僅改變在當前目錄下的文件的權限,在子目錄中的文件沒有得到根本改變。這與簡單地執行chmod 775 *.cgi完全相同。我看到人們使用諸如find等的解決方案。好極了,但爲什麼-R模式甚至存在,如果它甚至沒有完成任何事情?爲什麼chmod上的遞歸模式除了遞歸之外什麼都做?

+0

所有的答案酷感謝。使用find解釋的答案很有用,但我選擇了msw的答案,因爲我更加好奇-R的作用。我只是選擇了MSW而不是馬修,因爲MSW稍早一些。 – 2010-08-12 22:17:15

回答

14

可能是因爲你沒有命名*.cgi目錄。答曰manual

-R遞歸變更文件模式位。對於每個文件操作數名的 目錄,文件模式將在它下面的文件層次結構更改目錄的文件 模式位和所有 文件。

例如:

$ 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 
7

-R告訴chmod遞歸到被作爲參數給出任何目錄。

如果你說chmod -R 775 *.cgi,外殼將擴大到*.cgi匹配這個模式,其文件的列表,並通過作爲參數列表 - 所以chmod沒有被要求尋找到任何其他目錄。

(這遞歸到任何目錄它匹配*.cgi ...)

+0

哦,呃。所以遞歸地更改某個目錄下的所有文件很有用。 – 2010-08-12 22:08:10

6

要完成你想要嘗試

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

這裏find什麼產生的所有文件的一個列表.cgi從當前目錄向下結束,並將該列表傳遞給xargs,該列表將chmod應用於每個目錄。

3

*.cgi由您的shell擴展到當前目錄中以.cgi結尾的所有文件名列表。然後shell使用這個文件名列表調用chmod

chmod着眼於所有從外殼得到這些文件的名稱,改變有模式,並會遞歸,如果他們中的一些人目錄。但可能他們都不是,所以沒有任何遞歸。

要查找當前目錄及其子目錄下的所有CGI文件,並運行他們chmod,你可以這樣做:

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

這個答案是一樣的dmckee – 2013-05-22 12:32:06

2

*是一個shell內建命令,而-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 
+0

這個答案是一樣的dmckee – 2013-05-22 12:32:59