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

时间:2015-05-28 21:23:18

标签: tcl

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

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

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

如果我在shell中执行此操作,我只需使用find这样的内容:

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

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

非常感谢任何想法。

1 个答案:

答案 0 :(得分:0)

Tcllib有一个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特殊的字符。