||
TCL提供了两个命令进行文件名操作:glob和file,用来操作文件或获取文件信息。
glob命令采用一种或多种模式作为参数,并返回匹配这个(些)模式的所有文件的列表,其语法为:
glob ?switches? pattern ?pattern ...?
其中switches可以取下面的值:
-nocomplain :允许返回一个空串,没有-nocomplain时,如果结果是空的,就返回错误。
-- :表示switches结束,即后面以'-'开头的参数将不作为switches。
glob命令的模式采用string match命令(见8.5.7节)的匹配规则。例如:
%glob *.c *.h
main.c hash.c hash.h
返回当前目录中所有.c或.h的文件名。 glob 还允许模式中包含' 括在花括号中间以逗号分开的多种选择',例如 :
%glob {{src,backup}/*.[ch]}
src/main.c src/hash.c src/hash.h backup/hash.c
下面的命令和上面的命令等价:
glob {src/*.[ch]} {backup/*.[ch]}
注意:这些例子中模式周围的花括号是必须的,可以防止命令置换。在调用glob命令对应的C过程前这些括号会被TCL解释器去掉。
如果glob的模式以一斜线结束,那将只匹配目录名。例如:
glob */
只返回当前目录的所有子目录。
如果glob返回的文件名列表为空,通常会产生一个错误。但是glob的在样式参数之前的第一个参数是"-nocomplain"的话,这时即使结果为空,glob也不会产生错误。
对文件名操作的第二个命令是file。file是有许多选项的常用命令,可以用来进行文件操作也可以检索文件信息。这节讨论与名字相关的选项,下一节描述其他选项。使用file命令时,我们会发现其中有很明显的UNIX痕迹。
file atime name 返回一个十进制的字符串,表示文件name最后被访问的时间。时间是以秒为单位从1970年1月1日12:00AM开始计算。如果文件name 不存在或查询不到访问时间就返回错误。例:
% file atime license.txt
975945600
file copy ?-force? ?--? source target
file copy ?-force? ?--? source ?source ...? targetDir
这个命令把source中指明的文件或目录递归的拷贝到目的地址targetDir,只有当存在-force选项时,已经存在的文件才会被覆盖。试图覆盖一个非空的目录或以一个文件覆盖一个目录或以一个目录覆盖一个文件都会导致错误。--的含义和前面所说的一样。
file delete ?-force? ?--? pathname ?pathname ... ? 这个命令删除pathname指定的文件或目录,当指定了-force时,非空的目录也会被删除。即使没有指定-force,只读文件也会被删除。删除一个不存在的文件不会引发错误。
file dirname name 返回name中最后一个“/”前的所有字符;如果 name 不包含“/”,返回“.”;如果name 中最后一个“/”是第name的第一个字符,返回“/”。
file executable name 如果name对当前用户是可以执行的,就返回1,否则返回0。
file exists name 如果name存在于当前用户拥有搜索权限的目录下返回1,否则返回0。
file extension name 返回name中最后的“.”以后(包括这个小数点)的所有字符。如果name中没有“.”或最后斜线后没有“.”返回空字符。
file isdirectory name 如果name是目录返回1,否则返回0。
file isfile name 如果name是文件返回1,否则返回0。
file lstat name arrayName 除了利用lstat内核调用代理stat内核调用之外,和file stat命令一样,这意味着如果name是一个符号连接,那么这个命令返回的是这个符号连接的信息而不是这个符号连接指向的文件的信息。对于不支持符号连接的操作系统,这个命令和和file stat命令一样。
file mkdir dir ?dir ...? 这个命令和UNIX的mkdir命令类似,创建dir中指明的目录。如果dir已经存在,这个命令不作任何事情,也不返回错误。不过如果试图用一个目录覆盖已经存在的一个文件会导致错误。这个命令顺序处理各个参数,如果发生错误的话,马上退出。
file mtime name 返回十进制的字符串,表示文件name最后被修改的时间。时间是以秒为单位从1970年1月1日12:00AM开始计算。
file owned name 如果name被当前用户拥有,返回1,否则返回0。
file readable name 如果当前用户可对name进行读操作,返回1,否则返回0。
file readlink name 返回name代表的符号连接所指向的文件。如果name 不是符号连接或者找不到符号连接,返回错误。在不支持符号连接的操作系统(如windows)中选项readlink没有定义。
file rename ? -force? ?--? source target
file rename ?-force? ?--? source ?source ...? targetDir
这个命令同时具有重命名和移动文件(夹)的功能。把source指定的文件或目录改名或移动到targetDir下。 只有当存在-force选项时,已经存在的文件才会被覆盖。 试图覆盖一个非空的目录或以一个文件覆盖一个目录或以一个目录覆盖一个文件都会导致错误。
file rootname name 返回name中最后“.”以前(不包括这个小数点)的所有字符。如果name中没有“.”返回Name。
file size name 返回十进制字符串,以字节表示name的大小。如果文件不存在或得不到name的大小,返回错误。
file stat name arrayName 调用stat内核来访问name,并设置arrayName参数来保存stat的返回信息。 arrayName被当作一个数组,它将有以下元素:atime、ctime、dev、gid、ino、mode、mtime、nlink、size、type和uid。除了type以外,其他元素都是十进制的字符串,type元素和file type命令的返回值一样。其它各个元素的含义如下:
atime 最后访问时间.
ctime 状态最后改变时间.
dev 包含文件的设备标识.
gid 文件组标识.
ino 设备中文件的序列号.
mode 文件的mode比特位.
mtime 最后修改时间.
nlink 到文件的连接的数目.
size 按字节表示的文件尺寸.
uid 文件所有者的标识.
这里的atime、mtime、size元素与前面讨论的file的选项有相同的值。要了解其他元素更多的信息,就查阅stat系统调用的文件;每个元都直接从相应stat返回的结构域中得到。 文件操作的stat选项提供了简单的方法使一次能获得一个文件的多条信息。这要比分多次调用file来获得相同的信息量要显著的快。
file tail name 返回name中最后一个斜线后的所有字符,如果没有斜线返回name。
file type name 返回文件类型的字符串,返回值可能是下列中的一个: file、directory、characterspecial、blockSpecial、fifo、link或socket。
file writable name
如果当前用户对name可进行写操作,返回1,否则返回0。