Chmod

說明

變更檔案或指定目錄內所有檔案的權限。目前僅在 Unix 或 NonStop Kernel (Tandem) 下有作用。權限也採用 UNIX 樣式,就像 chmod 指令的參數。

請參閱 目錄為基礎的任務 部分,了解如何包含/排除檔案,以及如何撰寫模式。

此任務包含一個隱含的 FileSet,並直接支援 FileSet 的所有屬性和巢狀元素。可以使用巢狀的 <fileset><dirset> (自 Apache Ant 1.6 起) 元素指定更多組。

自 Ant 1.6 起,此任務也支援巢狀的 filelist

自 Ant 1.7 起,此任務支援巢狀的任意 資源集合 作為巢狀元素。

預設情況下,此任務會單獨呼叫底層的 chmod 指令。如果您處理大量檔案,可能會導致命令列過長,超過作業系統的限制。如果您遇到此類問題,應將此任務的 maxparallel 屬性設定為非零值。要使用的數字高度取決於檔案名稱的長度 (目錄樹的深度) 和作業系統,因此您必須稍加嘗試。POSIX 建議命令列長度限制至少為 4096 個字元,這可能會為您提供一個近似值,可用作這些實驗的初始值。

預設情況下,此任務不會執行任何動作,除非它偵測到它在 Unix 系統上執行。如果您確定您的 PATH 中有一個 chmod 可執行檔,其命令列與 Unix 指令相容,您可以使用任務的 os 屬性,並將其值設定為您目前的作業系統。

請參閱 setpermissions 任務,以取得與平台無關的替代方案。

參數

屬性 說明 必要
file 必須變更權限的檔案或單一目錄。 兩個屬性中必須有一個,除非指定巢狀的 <fileset|filelist|dirset> 元素
dir 包含必須變更權限的檔案的目錄。
注意:出於向後相容性的原因,<chmod dir="some-dir"/> 僅會變更 some-dir 的權限,但不會遞迴進入其中,除非您也指定任何模式。
perm 新的權限。
includes 以逗號或空格分隔的必須包含檔案範本清單。 否;預設為全部 (**)
排除 以逗號或空格分隔的必須排除檔案範本清單。 否;預設為預設排除或如果 defaultexcludesno 則為無
defaultexcludes 表示是否應使用預設排除 (yes|no)。 否;預設為 yes
平行 使用單一 chmod 命令處理所有指定的檔案。 否;預設為 true
類型 filedirboth 之一。如果設定為 file,則只會變更純文字檔案的權限。如果設定為 dir,則只會考慮目錄。
注意:類型屬性不適用於巢狀 dirsetdirset 始終隱含假設類型為 dir
否;預設為 file
maxparallel 透過一次傳遞最多這麼多個來源檔案來限制平行處理的數量。將其設定為負整數表示無限制。自 Ant 1.6 起 否;預設為無限制
詳細 是否在執行後列印摘要。自 Ant 1.6 起 否;預設為 false
作業系統 可以在其上執行命令的作業系統清單。
作業系統系列 <os> 條件中使用的作業系統系列。 否;預設為 unix

範例

讓 UNIX 系統上的任何人可以讀取和執行 start.sh 檔案。

<chmod file="${dist}/start.sh" perm="ugo+rx"/>

讓 UNIX 系統上的所有人只能讀取、寫入和執行 start.sh 檔案。

<chmod file="${dist}/start.sh" perm="700"/>

讓 UNIX 系統上的任何人可以讀取和執行 ${dist}/bin 下的所有 .sh 檔案。

<chmod dir="${dist}/bin" perm="ugo+rx"
       includes="**/*.sh"/>

讓 UNIX 系統上 shared/sources1 下的所有檔案(除了 trial 目錄下的檔案)可以讓同一個群組的成員寫入。此外,屬於 idother.shared.sources 的 FileSet 中的所有檔案都會取得相同的權限。

<chmod perm="g+w">
  <fileset dir="shared/sources1">
    <exclude name="**/trial/**"/>
  </fileset>
  <fileset refid="other.shared.sources"/>
</chmod>

禁止非擁有者觸碰 cgi 程式碼、副檔名為 .old 的檔案或以 private_ 開頭的目錄。副檔名為 .old 的目錄或以 private_ 開頭的檔案將不受影響。

<chmod perm="go-rwx" type="file">
  <fileset dir="/web">
    <include name="**/*.cgi"/>
    <include name="**/*.old"/>
  </fileset>
  <dirset dir="/web">
    <include name="**/private_*"/>
  </dirset>
</chmod>

maxparallel 屬性的注意事項

有些 shell 對命令列可以包含的字元數量有限制。此最大限制會因 shell 和作業系統而異。如果需要變更大量檔案的模式,請考慮使用 maxparallel 屬性。例如,在使用 AIX 時,如果達到限制,系統會回應警告:「警告:UNIXProcess.forkAndExec 原生錯誤:參數或環境清單過長」。約 300 的值似乎會產生可接受的命令列。