如何用TCL递归查找.vhd文件并复制到脚本调用目录?
在TCL中递归查找并复制.vhd文件
方法一:使用glob的递归特性(TCL 8.5+)
TCL 8.5及以上版本的glob命令支持-recursive参数,可直接递归遍历目录:
# 设置源目录(替换为你的目标查找目录) set source_dir "/path/to/your/source/directory" # 获取脚本执行时的当前目录(即文件复制的目标目录) set target_dir [pwd] # 递归查找所有.vhd文件,-nocomplain避免无匹配文件时直接报错 set vhd_files [glob -nocomplain -directory $source_dir -recursive *.vhd] # 遍历文件列表并执行复制 foreach file $vhd_files { # -force选项会覆盖目标目录中已存在的同名文件,不需要覆盖可移除该参数 file copy -force $file $target_dir puts "已复制:$file -> $target_dir" }
方法二:自定义递归函数(兼容旧版TCL)
如果你的TCL版本低于8.5,可自行实现递归遍历逻辑:
# 递归查找指定目录下的.vhd文件 proc find_vhd_files {dir} { set file_list {} # 遍历当前目录下的所有条目 foreach entry [glob -nocomplain -directory $dir *] { if {[file isdirectory $entry]} { # 若为子目录,递归调用并合并结果 lappend file_list {*}[find_vhd_files $entry] } elseif {[string match "*.vhd" [file tail $entry]]} { # 若为.vhd文件,加入结果列表 lappend file_list $entry } } return $file_list } # 主逻辑 set source_dir "/path/to/your/source/directory" set target_dir [pwd] set vhd_files [find_vhd_files $source_dir] foreach file $vhd_files { file copy -force $file $target_dir puts "已复制:$file -> $target_dir" }
注意事项
- 替换
source_dir为实际需要查找的目录,支持相对路径或绝对路径 -nocomplain参数确保目录中无.vhd文件时脚本不会直接终止- 若不需要覆盖目标目录的同名文件,可移除
file copy命令中的-force参数,此时遇到同名文件会报错停止 - 确保脚本拥有读取源目录文件和写入目标目录的权限
内容的提问来源于stack exchange,提问作者quantum231
相关产品推荐
相关产品推荐

