如何在TCL中的目录树中搜索以.so或.a结尾的文件,并构建这些目录的列表

如何在TCL中的目录树中搜索以.so或.a结尾的文件,并构建这些目录的列表,tcl,Tcl,我正在尝试编写一组TCL脚本,作为支持解决方案的一部分,帮助为一组不在其标准LD\u LIBRARY\u路径中的库设置用户环境 由于该系统在我可以安装的方面非常稀少,因此我实际上没有访问任何TCL扩展的权限,我正在尽可能多地尝试在基本TCL中实现这一点。作为一种语言,我对TCL也比较陌生 我要做的是在目录结构中搜索,找到其中包含.so和.a文件的目录,建立这些文件的列表,并最终将它们添加到用户的$LD\u LIBRARY\u PATH变量中 如果我在shell中执行此操作,我只会使用find来执

我正在尝试编写一组TCL脚本,作为支持解决方案的一部分,帮助为一组不在其标准
LD\u LIBRARY\u路径中的库设置用户环境

由于该系统在我可以安装的方面非常稀少,因此我实际上没有访问任何TCL扩展的权限,我正在尽可能多地尝试在基本TCL中实现这一点。作为一种语言,我对TCL也比较陌生

我要做的是在目录结构中搜索,找到其中包含
.so
.a
文件的目录,建立这些文件的列表,并最终将它们添加到用户的
$LD\u LIBRARY\u PATH
变量中

如果我在shell中执行此操作,我只会使用find来执行以下操作:

find /dir -type f \( -name "*.so" -o -name "*.a" \) | awk -F/ 'sub(FS $NF,x)' | sort -u
我可以硬编码路径,但我们需要一组可以管理多个不同应用程序的脚本

如果您有任何想法,我们将不胜感激。

有一个模块可以进行递归查找:

package require fileutil
set filenames [::fileutil::findByPattern /dir -glob {*.so *.a}]
foreach filename $filenames {
    if {[file isfile $filename]} {
        set dirs([file dirname $filename]) 1
    }
}
puts [array names dirs]
如果您想使用它,但无法安装某些东西,您可以将这些过程添加到代码中(具有适当的属性)——

否则,只需调用系统的
find
命令并解析输出(假设文件名不包含换行符)


提取唯一目录的循环与此类似。另一个好处是,
find
调用实际上更易于阅读,因为您不必逃避shell的所有特殊字符。

@glennjackman,这在TCL中?查看TCL/TK网站上的文档时,没有发现find命令。我希望在TCL中完成这一切,但我想我现在将实现exec选项,直到我了解更多关于fileutil的信息。谢谢!
set filenames [split [exec find /dir -type f ( -name *.so -o -name *.a )] \n]