TCL练习6:通过递归方法搜索文件夹并返回指定后缀文件(包含子目录)

这是一个TCL脚本,用于在指定目录及其子目录下查找特定类型的文件(如.hdl或.xdc),并将找到的文件路径和名称记录到不同的文件中。脚本从define.tcl获取参数,如目标文件夹、记录位置和文件后缀,然后遍历srcs和constraints文件夹,分别记录.vhd等HDL文件和.xdc约束文件。搜索结果分别写入code.rd和cons.rd文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写这个TCL脚本的主要目的是搜索目标文件夹及其子文件夹下的所有文件,然后记录在指定的文件中。可以指定目标文件夹名称、信息记录位置和文件后缀等3种参数。

该脚本将用于Vivado的non-project编译过程,被综合和布线脚本调用。

define.tcl中定义了目标文件夹名称、信息记录位置、文件后缀类型、器件part等信息。findAllFiles.tcl脚本根据define.tcl中的参数搜索目标文件夹,当文件后缀类型参数(ext)为.hdl时,会搜索.v、.vh、.vhd、.sv等文件的路径和名称,并记录在./Tcl/code.rd中;当文件后缀类型参数为.xdc时,会搜索.xdc文件,并记录在./Tcl/cons.rd中。设计代码放置在srcs文件夹中,约束文件放置在constraints文件夹中。如果没有分类放置也可以正确识别。

set part "xcvu3p-ffvc1517-2-e"
set srcsPath "../srcs"
set consPath "../Constraints"
set codeRec "./code.rd"
set consRec "./cons.rd"
set codeExt ".hdl"
set consExt ".xdc"

set top "Top"
set synthDir "$top.synth"
set synthLog "synth.log"
set synthDcp "_synth.dcp"

以下是findAllFiles.tcl的内容。

source ./define.tcl

set status [catch {set codeF [open $codeRec w+]} msg]
if {$status} { puts $msg }

proc find
<think>我们正在讨论Tcl的`glob`命令选项用法。用户之前询问了关于`glob`命令的选项,而我们的回答将基于此。注意:用户提到的引用内容(如Perl模块、Shell脚本IDE配置)与当前问题无关,因此忽略这些引用。我们需要专注于Tcl的`glob`命令。Tcl中的`glob`命令用于获取匹配特定模式的文件名列表。其基本语法为:glob?options?pattern?pattern...?常用选项包括:--nocomplain:如果没有匹配的文件,不报错(返回空列表)--typestypeList:根据类型筛选(如d表示目录,f表示普通文件--directorydir:指定目录中匹配--path:返回完整路径(默认情况下,返回的是相对于当前目录的路径)我们逐一解释这些选项:1.-nocomplain:默认情况下,如果没有匹配的文件,glob会报错。使用此选项后,即使没有匹配,也不会报错,而是返回空列表。2.-typestypeList:用于指定匹配的文件类型类型可以是以下之一或组合(多个类型用空格分隔):d-目录f-普通文件l-符号链接(仅当指向现有文件时才会匹配)......此外,还有一些特殊类型,如:r-可读文件w-可写文件x-可执行文件注意:在指定多个类型时,可以组合,例如:`-types{dr}`表示可读目录。3.-directorydir:指定的目录中执行匹配。这相当于在dir目录下执行glob,而不需要先改变当前目录。4.-path:默认情况下,返回文件名是相对于当前工作目录的路径(如果使用绝对路径模式则返回绝对路径,否则返回相对路径)。但有时我们想确保返回的是完整的绝对路径,可以使用`-path`选项(尽管它不总是返回绝对路径,实际行为取决于模式)。但更常用的可能是结合`[filenormalize]`来获取绝对路径。5.其他选项:如`--`表示选项结束,后面是模式,可用于模式以`-`开头的情况。下面提供一些使用示例:示例1:基本用法glob*.txt;#匹配当前目录下所有.txt文件示例2:使用-nocomplainglob-nocomplain*.log;#若没有.log文件,则返回空列表而不报错示例3:使用-typesglob-typesf*.txt;#只匹配普通文件(非目录)glob-typesd*;#只匹配目录示例4:使用-directoryglob-directory/home/user*.tcl;#匹配/home/user目录下所有.tcl文件示例5:多个模式glob{*.c*.h};#匹配当前目录下所有.c.h文件示例6:使用-pathglob-path/home/user/*.txt;#返回类似/home/user/a.txt这样的绝对路径注意:在Tcl中,glob默认不匹配隐藏文件(以点开头的文件),除非模式明确指定,例如:glob.*另外,可以使用“-join”选项(Tcl8.5+)来将多个模式作为一个整体,避免因模式中包含空格而需要加引号。下面是一个综合示例:假设我们想获取指定目录下的所有普通文本文件所有目录(不包括子目录中的文件,仅当前目录):setdir/path/to/dirsetfiles[glob-directory$dir-nocomplain-types{fd}*]注意:上面的`-types{fd}`可以同时匹配文件目录。安全提示:当模式来自用户输入时,要注意模式中可能包含的特殊字符(如[、]等)可能需要转义,但glob本身不提供转义选项,因此对于不可信输入需谨慎。最后,由于用户需求是了解glob命令的选项用法,我们提供了以上内容。相关问题:1.Tcl中如何递归列出所有文件?2.glob命令中如何匹配隐藏文件?3.Tcl的globfile命令有什么区别联系?</think> ### Tcl中的`glob`命令选项详解 Tcl的`glob`命令用于文件目录的模式匹配,支持多个选项控制匹配行为。基本语法如下: ```tcl glob ?options? pattern ?pattern ...? ``` #### 核心选项用法 1. **`-nocomplain`** 忽略未找到匹配项的错误,返回空列表 ```tcl set files [glob -nocomplain *.log] ;# 无.log文件返回空列表 ``` 2. **`-types`** 按类型筛选文件(可组合使用) ```tcl # 匹配目录普通文件 glob -types {d f} * ``` | 类型标识 | 说明 | |----------|--------------| | `d` | 目录 | | `f` | 普通文件 | | `l` | 符号链接 | | `r` | 可读文件 | | `b` | 块设备文件 | 3. **`-directory`** 在指定目录下执行匹配 ```tcl set log_dir "/var/log" set logs [glob -directory $log_dir *.gz] ;# 匹配/var/log下所有.gz文件 ``` 4. **`-path`** 返回完整路径(替代传统`-directory` + 模式) ```tcl glob -path {/home/user/*.tcl} ;# 返回/home/user/a.tcl等 ``` 5. **`--`** 终止选项解析,处理特殊模式 ```tcl glob -- "-file.txt" ;# 匹配以破折号开头的文件 ``` #### 进阶用法示例 1. **递归匹配所有文本文件** ```tcl glob -nocomplain -types f -directory /docs -tails *.txt *.md ``` 2. **匹配指定后缀的非隐藏文件** ```tcl glob -types f -path {/data/*[^.]*.{csv,txt}} ``` #### 注意事项 1. **大小写敏感** 在Windows/MacOS中默认不敏感,Unix系统中敏感(可用`string tolower`预处理路径) 2. **转义特殊字符** 匹配`[]$*?`时需用反斜杠转义:`glob {file\[1\].txt}` 3. **性能优化** 限制递归深度:`glob -path {/big_dir/*/*.dat}` 避免`**`全盘扫描[^1] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值