Table of Contents
There are two commands that provide information about the file
system, glob and file.
glob provides the access to the
names of files in a directory. It uses a name matching mechanism
similar to the UNIX ls command or the Windows (DOS)
dir command, to return a list of names that match a
pattern.
file provides three sets of
functionality:
String manipulation appropriate to parsing file names
dirname ........ Returns directory
portion of path
extension ........ Returns file name
extension
join ........ Join directories and the
file name to one string
nativename ....... Returns the
native name of the file/directory
rootname ....... Returns file name
without extension
split ........ Split the string into
directory and file names
tail .................... Returns
filename without directory
Information about an entry in a directory:
atime ................ Returns time of
last access
executable ..... Returns 1 if file is
executable by user
exists ................ Returns 1 if
file exists
isdirectory ...... Returns 1 if entry
is a directory
isfile .................. Returns 1 if
entry is a regular file
lstat ................... Returns
array of file status information
mtime ............... Returns time of
last data modification
owned ................ Returns 1 if
file is owned by user
readable ............ Returns 1 if
file is readable by user
readlink ............. Returns name of
file pointed to by a symbolic link
size ..................... Returns
file size in bytes
stat ..................... Returns
array of file status information
type .................... Returns type
of file
writable ............ Returns 1 if
file is writeable by user
Manipulating the files and directories themselves:
copy ................ Copy a file or a
directory
delete ................ Delete a file
or a directory
mkdir ................ Create a new
directory
rename ................ Rename or move
a file or directory
Between these two commands, a program can obtain most of the information that it may need and manipulate the files and directories.
While retrieving information about what files are present and what properties they have is usually a highly platform-dependent matter, Tcl provides an interface that hides almost all details that are specific to the platform (but are irrelevant to the programmer).
To take advantage of this feature, always manipulate file names
via the file join, file split commands and the others in the first
category.
For instance to refer to a file in a directory upwards of the current one:
set upfile [file join ".." "myfile.out"]
# upfile will have the value "../myfile.out"
(The ".." indicates the "parent directory")
Because external commands may not always deal gracefully with the uniform representation that Tcl employs (with forward slashes as directory separators), Tcl also provides a command to turn the string into one that is native to the platform:
#
# On Windows the name becomes "..\myfile.out"
#
set newname [file nativename [file join ".." "myfile.out"]]
Retrieving all the files with extension ".tcl" in the current directory:
set tclfiles [glob *.tcl]
puts "Name - date of last modification"
foreach f $tclfiles {
puts "$f - [clock format [file mtime $f] -format %x]"
}
(The clock command turns the number of seconds returned by the
file mtime
command into a simple date string, like "12/22/04")
glob ?switches? pattern
?patternN?returns a list of file names that match
pattern or
patternN
switches may be one of the following
(there are more switches available):
-nocomplainAllows
glob to return an empty
list without causing an error. Without this flag, an error would be
generated when the empty list was returned.
-types typeListSelects which type of files/directory the command should return. The
typeList may consist of type
letters, like a "d" for directories and "f" for ordinary files as
well as letters and keywords indicating the user's permissions ("r"
for files/directories that can be read for instance).
--Marks the end of switches. This allows the use of "-" in a pattern without confusing the glob parser.
pattern follows the same matching rules
as the string match globbing rules with these exceptions:
{a,b,...} Matches any of the strings a,b, etc.
A "." at the beginning of a filename must match a "." in the filename. The "." is only a wildcard if it is not the first character in a name.
All "/" must match exactly.
If the first two characters in
pattern
are ~/, then the ~ is replaced by the value of the
HOME environment variable.
If the first character in
pattern is a
~, followed by a login id, then the ~loginid is
replaced by the path of loginid's home directory.
Note that the filenames that match pattern are returned in an arbitrary order (that is,
do not expect them to be sorted in alphabetical order, for
instance).
file atime nameReturns the number of seconds since some system-dependent start date, also known as the "epoch" (frequently 1/1/1970) when the file
name was last accessed. Generates an error
if the file doesn't exist, or the access time cannot be
queried.
file copy
?-force? name
targetCopy the file/directory
name to a new
file
target (or to an existing directory
with that name)
-force allows you to overwrite
existing files.
file delete ?-force? nameDelete the file/directory
name.
-force allows you to delete
non-empty directories.
file dirname nameReturns the directory portion of a path/filename string. If
name contains no slashes,
file
dirname returns a
".". If the last "/" in
name is also the
first character, it returns a "/".
file executable nameReturns 1 if file
name is executable
by the current user, otherwise returns 0.
file exists nameReturns 1 if the file
name exists, and
the user has search access in all the directories leading to the
file. Otherwise, 0 is returned.
file extension nameReturns the file extension.
file isdirectory nameReturns 1 if file name is a directory, otherwise returns 0.
file isfile nameReturns 1 if file name is a regular file, otherwise returns 0.
file lstat name varNameThis returns the same information returned by the system call
lstat. The results are placed in the associative array
varName. The indexes in
varName are:
atime.......time of last access
ctime.......time of last file status
change
dev...........inode's device
gid............group ID of the file's
group
ino............inode's number
mode.......inode protection mode
mtime.....time of last data
modification
nlink........number of hard links
size...........file size, in
bytes
type..........Type of File
uid.............user ID of the file's
owner
Because this calls lstat, if name
is a symbolic link, the values in varName
will refer to the link, not the file that is linked to. (See also
the stat subcommand)
file mkdir nameCreate a new directory
name.
file mtime nameReturns the time of the last modification in seconds since Jan 1, 1970 or whatever start date the system uses.
file owned nameReturns 1 if the file is owned by the current user, otherwise returns 0.
file readable nameReturns 1 if the file is readable by the current user, otherwise returns 0.
file readlink nameReturns the name of the file a symlink is pointing to. If
name isn't a symlink, or can't be read, an
error is generated.
file rename ?-force? name targetRename file/directory
name to the new
name
target (or to an existing directory
with that name)
-force allows you to overwrite
existing files.
file rootname nameReturns all the characters in
name up
to but not including the last ".". Returns
$name if
name doesn't include
a ".".
file size
nameReturns the size of
name in
bytes.
file stat
name varNameThis returns the same information returned by the system call stat. The results are placed in the associative array
varName. The indexes in
varName are:
atime.......time of last access
ctime.......time of last file status
change
dev...........inode's device
gid............group ID of the file's
group
ino............inode's number
mode.......inode protection mode
mtime.....time of last data
modification
nlink........number of hard links
size...........file size in bytes
type..........Type of file
uid.............user ID of the file's
owner
file tail
nameReturns all of the characters in
name
after the last slash. Returns the name if
name contains no slashes.
file type
nameReturns a string giving the type of file name, which will be one of:
file...................................Normal
file
directory........................Directory
characterSpecial.......Character
oriented device
blockSpecial.............. Block
oriented device
fifo...................................Named pipe
link..................................Symbolic
link
socket...........................Named
socket
file writable nameReturns 1 if file name is writable by the current user, otherwise returns 0.
Note: