Tcl“文件重命名{*} [glob * tcl] dir /”如何工作

时间:2019-02-22 16:20:02

标签: tcl

我试图使用Tcl移动大量文件,并遇到了表达式:     file rename {*}[glob *tcl] dir/效果很好。 谁能解释此命令的工作方式或此功能的名称?

1 个答案:

答案 0 :(得分:1)

这是两个命令和一些有用的语法的组合。

  • glob返回与该模式匹配的文件名的 list ,在您的情况下为*tcl,如果没有匹配项,则返回错误。您可以使用很多选项来修改返回的内容,但是您不会使用其中任何一个。这对您的用例来说很棒。
  • file rename将重命名文件或移动文件。特别是,当最后一个参数是现有目录名称时,其他参数是将移入该目录的文件(或目录)。 (如果您熟悉POSIX系统调用的工作方式,那么将其移动是明智的。)

难题的最后一部分是{*}[],即命令扩展,它运行命令(在您的情况下为glob *tcl)并使用列表中的元素作为返回使用该列表的命令调用的参数序列。哪个有用;我们需要在file rename调用时的文件名列表。除了诸如内存之类的基本功能外,可以通过这种方式移动的参数数量没有实际限制。

{*}前缀(仅在单词开头是特殊的)可以与生成Tcl单词的其他格式良好的方式一起使用(例如,使用$从变量读取或一个带有{…}的字面量,甚至带有复合词的字面量,尽管与复合词一起使用通常表示您正在做的事情是不明智的。


如果您有旧的Tcl代码(是为Tcl 8.4或更早版本编写的),则不会看到{*}。相反,您会看到以下内容:

eval file rename [glob *tcl] dir/
# Or, more properly, one of these horrors:
eval {file rename} [glob *tcl] {dir/}
eval [list file rename] [glob *tcl] [list dir/]
eval [linsert [linsert [glob *tcl] 0 file rename] end dir/]

众所周知,在棘手的情况下,这些方法很难正确处理(导致许多细微的错误)。完全在Tcl 8.5中添加了扩展语法,以消除此类麻烦。 eval在现代Tcl中仍然存在,但值得庆幸的是现在很少使用。