0

我正在学习 tcl (expect),现在我遇到了一个有趣的问题。我需要一个命令来移动/重命名一堆扩展名为 .status 的文件。我试过这些:

spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir

当然,那没有用。我用谷歌搜索了一下,发现了一些关于 glob 的东西,但它似乎并没有按照我想要的方式工作。如果我做:

exec /bin/mv [glob *.status] somedir

mv抱怨说“1.status 2.status 3.status ...等” 不是一个有效的文件。就好像整个文件列表连接在一个字符串中,而不是单独处理。

试图通过谷歌查找更多信息导致我发现很多损坏和过时的链接,所以我希望除了解决这个问题之外,你能否指出一些关于 tcl/expect 基础知识和常见陷阱的好的在线资源。

更新:只接受在 /bin 中使用标准 tcl 和标准工具的解决方案。

4

5 回答 5

5

兰迪的回答简短而正确,但不需要使用 exec。约瑟夫的回答非常有力,但有点长。

对于一个简短而惯用的答案,我会使用(需要 Tcl 8.5):

文件重命名 {*}[glob *.status] some_dir

于 2009-02-17T20:15:31.700 回答
2
proc move_to_dir {filenames dirname} {
    foreach filename $filenames {
        file rename $filename [file join $dirname [file tail $filename]]
    }
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/
于 2009-02-17T17:42:58.700 回答
1
$ ls -1
1.状态
2.状态
重命名.tclsh*
some_dir/
两个词.status

$ 猫重命名.tclsh
#!/usr/local/bin/tclsh

eval exec /bin/mv [glob *.status] some_dir

$ ./rename.tclsh

$ ls -1
重命名.tclsh*
some_dir/

$ ls -1 some_dir/
1.状态
2.状态
两个词.status
于 2009-02-17T13:17:05.093 回答
0

当有很多文件等时,此解决方案适用于名称包含空格的文件:

exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir

但它需要 find 和 xargs,它们最常位于 /usr/bin,而不是 /bin。

于 2009-02-17T15:39:19.090 回答
0

作为使用复杂的“查找”命令并可能删除数据时的一项安全功能,我在命令前面添加了一个“回显”并将其捕获到文件中。
然后,我可以在使用“源”运行它之前检查文件中列出的命令。

这也是手动处理那些偶尔出现的边缘案例文件的一种方式。

于 2009-02-17T18:52:02.853 回答