Chmod

描述

更改文件或指定目录中所有文件的权限。目前它仅在 Unix 或 NonStop 内核(Tandem)下有效。权限也采用 UNIX 样式,类似于 chmod 命令的参数。

有关如何包含/排除文件以及如何编写模式的信息,请参阅有关 基于目录的任务 的部分。

此任务包含一个隐式 FileSet,并直接支持 FileSet 的所有属性和嵌套元素。可以使用嵌套的 <fileset><dirset>自 Apache Ant 1.6 起)元素指定更多集合。

自 Ant 1.6 起,此任务还支持嵌套的 filelist

自 Ant 1.7 起,此任务支持任意 资源集合 作为嵌套元素。

默认情况下,此任务将使用底层 chmod 命令的单个调用。如果您正在处理大量文件,这可能会导致命令行过长,超出您的操作系统的限制。如果您遇到此类问题,应将此任务的 maxparallel 属性设置为非零值。要使用的数字高度取决于您的文件名长度(您的目录树的深度)和您的操作系统,因此您需要进行一些实验。POSIX 建议命令行长度限制至少为 4096 个字符,这可以为您提供一个近似值,您可以将其用作这些实验的初始值。

默认情况下,此任务除非检测到它正在 Unix 系统上运行,否则不会执行任何操作。如果您确定您的 PATH 上有一个与 Unix 命令兼容的命令行 chmod 可执行文件,您可以使用任务的 os 属性并将它的值设置为您的当前操作系统。

有关平台无关的替代方案,请参阅 setpermissions 任务。

参数

属性 描述 必需
file 必须更改其权限的文件或单个目录。 两者之一,除非指定了嵌套的 <fileset|filelist|dirset> 元素
dir 包含必须更改其权限的文件的目录。
注意:出于向后兼容性的原因,<chmod dir="some-dir"/> 仅会更改 some-dir 的权限,而不会递归到其中,除非您还指定了任何模式。
perm 新的权限。
includes 必须包含的文件模式的逗号或空格分隔列表。 否;默认为所有(**
excludes 必须排除的文件模式的逗号或空格分隔列表。 否;默认为默认排除项,或者如果 defaultexcludesno 则为无
defaultexcludes 指示是否应使用默认排除项 (yes|no)。 否;默认为 yes
parallel 使用单个 chmod 命令处理所有指定的文件。 否;默认为 true
type filedirboth 之一。如果设置为 file,则仅更改普通文件的权限。如果设置为 dir,则仅考虑目录。
注意:type 属性不适用于嵌套的 dirset——dirset 始终隐式地假定 type 为 dir
否;默认为 file
maxparallel 通过一次最多传递这么多源文件来限制并行程度。将其设置为负整数表示无限制。自 Ant 1.6 起 否;默认为无限制
verbose 是否在执行后打印摘要。自 Ant 1.6 起 否;默认为 false
os 可以在其上执行命令的操作系统列表。
osfamily <os> 条件中使用的操作系统系列。 否;默认为 unix

示例

使 start.sh 文件对 UNIX 系统上的任何人可读和可执行。

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

使 start.sh 文件仅对 UNIX 系统上的所有者可读、可写和可执行。

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

使 ${dist}/bin 下的所有 .sh 文件对 UNIX 系统上的任何人可读和可执行。

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

使 shared/sources1 下的所有文件(除了任何名为 trial 的目录下的文件)对 UNIX 系统上的同一组的成员可写。此外,属于 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 并达到限制时,系统会发出警告:"Warning: UNIXProcess.forkAndExec native error: The parameter or environment lists are too long"。大约 300 的值似乎会导致可以接受的命令行。