On top of the
file commands, the
::fileutil package which is shipped with Tcl includes a range of commonly used structures ("design patterns") which means you don't have to keep wring your own composites. Here is a
combined list, sorting them out by category rather than by which command or package they happen to be a part of:
File and path handling commands that do NOT look at the actual file system:
file dirname name
file extension name
file join name ?name ...?
file nativename name
file pathtype name
file rootname name
file split name
file tail name
::fileutil::lexnormalize path
::fileutil::fullnormalize path
::fileutil::stripN path n
::fileutil::stripPwd path
::fileutil::stripPath prefix path
::fileutil::jail jail path
::fileutil::relative base dst
::fileutil::relativeUrl base dst
Commands that test files and tell you about their status / type
file atime name
file executable name
file exists name
file isdirectory name
file isfile name
file lstat name varName
file mtime name
file owned name
file readable name
file readlink name
file size name
file stat name varName
file system name
file type name
file writable name
::fileutil::test path codes ? msgvar ? ? label ?
Commands that read / manipulate files and their contents
file copy ?-force? ?--? source target
file copy ?-force? ?--? source ?source ...? targetDir
file delete ?-force? ?--? pathname ?pathname ... ?
file mkdir dir ?dir ...?
file rename ?-force? ?--? source target
file rename ?-force? ?--? source ?source ...? targetDir
::fileutil::cat ( ? options ? file)...
::fileutil::writeFile ? options ? file data
::fileutil::appendToFile ? options ? file data
::fileutil::insertIntoFile ? options ? file at data
::fileutil::install ? -m mode ? source destination
::fileutil::touch ? -a ? ? -c ? ? -m ? ? -r ref_file ? ? -t time ? filename ? ... ?
::fileutil::removeFromFile ? options ? file at n
::fileutil::replaceInFile ? options ? file at n data
::fileutil::updateInPlace ? options ? file cmd
Commands that search for files that meet criteria
::fileutil::fileType filename
::fileutil::find ? basedir ? filtercmd ? ?
::fileutil::findByPattern basedir ? -regexp|-glob ? ? -- ? patterns
::fileutil::foreachLine var filename cmd
::fileutil::grep pattern ? files ?
Commands that handle temportary directories
::fileutil::tempdir
::fileutil::tempdir path
::fileutil::tempdirReset
::fileutil::tempfile ? prefix ?
Commands that work with the internals
file attributes name
file attributes name ?option?
file attributes name ?option value option value...?
file channels ?pattern?
file volumes
Some examples
set about [fileutil::fileType requests.xyz]
puts $about
(note that
file type tells you whether a file is a directory, plain file, link, etc, whereas
fileutil::fileType tells you about the file contents - whether it's plain text, for example.
Read the whole of a file, split it into a list, and process it line by line.
set content [split [fileutil::cat requests.xyz] "\n"]
foreach line $content {
set record [split $content " "]
set name [lindex $line 0]
puts "Let me tell you about $name"
foreach skill [lrange $line 1 end] {
puts ".... (s)he knows $skill"
}
}
results:
Let me tell you about antonia
.... (s)he knows Perl
.... (s)he knows XML
.... (s)he knows PHP
.... (s)he knows Tcl/Tk
.... (s)he knows MySQL
Let me tell you about barbara
.... (s)he knows Tcl/Tk
.... (s)he knows ASP
.... (s)he knows Ruby
.... (s)he knows Java
etc
Recursive list of my home directory:
set relations [fileutil::find $env(HOME)]
puts $relations
List all files under my parent directory ending in .txt
set relations [fileutil::findByPattern .. -regexp {\.txt$}]
puts $relations
Find all files in my live web site data directory over 2 Mbytes in size:
proc is_big name {
return [expr [file size $name] > 2000000]
}
set huge [fileutil::find /Library/WebServer/live_html/data is_big]
puts [join $huge \n]
Complete example on our web site
[here]. This example now covered on our
Learning to Program in Tcl and
Tcl and Expect programming courses.
(written 2012-02-18)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
T209 - Tcl/Tk - File and Directory Handling [779] The fragility of pancakes - and better structures - (2006-06-26)
[785] Running external processes in Tcl and Tcl/Tk - (2006-06-29)
[1407] Reading from another process in Tcl (pipes and sockets) - (2007-10-26)
[1426] Buffering up in Tcl - the empty coke can comparison - (2007-11-10)
[1467] stdout v stderr (Tcl, Perl, Shell) - (2007-12-10)
[2467] Tcl - catching an error before your program crashes - (2009-10-22)
[3192] Tcl - Some example of HOW TO in handling data files and formats - (2011-03-04)
[3320] Reading the nth line from a file (Perl and Tcl examples) - (2011-06-09)
[3429] Searching through all the files in or below a directory - Ruby, Tcl, Perl - (2011-09-09)
[4461] Reading from a URL, and reading Json, from your Tcl script - (2015-03-12)
[4523] Catching failed commands and not crashing the program in Tcl - (2015-10-10)
[4524] Tcl - a new example for data reformatting - (2015-10-10)
Some other Articles
Matching regular expressions, and substitutions, in RubyFinding the total, average, minimum and maximum in a programRuby v Perl - a comparison examplelists and struct::list in Tcl - Introduction to struct::list and examplesThe fileutil package and a list of file system commands in TclBus top - colours of LondonHistoric documents for WiltshireTcl - dicts - a tutorial and examplesKeeping Business Local. But is that realistic?Help to get online in Melksham