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

How to search a a directory tree in TCL for files that end in .so or .a and build a list of those directories

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

由于系统在我可以安装的方面相当稀疏,我实际上无法访问任何 TCL 扩展,并且我正在尝试尽可能多地在基本 TCL 中执行此操作。作为一种语言,我对 TCL 也比较陌生。

我想做的是搜索目录结构并找到其中包含 .so.a 文件的目录,构建这些文件的列表,并最终添加它们到用户的 $LD_LIBRARY_PATH 变量。

如果我在 shell 中执行此操作,我会像这样使用查找:

find /dir -type f \( -name "*.so" -o -name "*.a" \) | awk -F/ 'sub(FS $NF,x)' | sort -u

我可以对路径进行硬编码,但我们需要一组脚本来管理多个不同的应用程序。

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

Tcllib has a fileutil 执行递归查找的模块:

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]

如果你想使用这个,但不能安装一些东西,你可以把这些程序添加到你的代码中(加上适当的属性)——http://core.tcl.tk/tcllib/dir?ci=63d99a74f4600441&name=modules/fileutil

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

set filenames [split [exec find /dir -type f ( -name *.so -o -name *.a )] \n]

与提取唯一目录的循环类似。作为附带好处,find 调用实际上更易于阅读,因为您不必转义 shell.

的所有特殊字符