我学习TCL(预计),现在我来到了一个有趣的问题。我需要一个命令移动/重命名扩展.STATUS一堆文件。我尝试这些:

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

当然,没有工作。我用Google搜索了一下,发现一些关于水珠,但它似乎没有工作,我希望它的方式。如果我做的:

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

<强> MV 抱怨 '1.status 2.status 3.status ...等。'是不是有效的文件。它,就好像文件的整个列表是在一个单独的字符串,而不是被单独处理级联。

试图找到通过谷歌的更多信息使我有很多破碎的和过时的链接,所以我希望身边解决这个问题,你可以点我一些很好的在线资源,为TCL /期待基础知识和常见的陷阱。

更新:的,只有使用标准的TCL和位于/ bin标准工具的解决方案将被接受

有帮助吗?

解决方案

$ ls -1
1.status
2.status
rename.tclsh*
some_dir/
two words.status

$ cat rename.tclsh
#!/usr/local/bin/tclsh

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

$ ./rename.tclsh

$ ls -1
rename.tclsh*
some_dir/

$ ls -1 some_dir/
1.status
2.status
two words.status

其他提示

兰迪的回答是短期和正确的,但使用一个可执行程序,而不需要。 约瑟夫的答案是非常强大的,但有点长。

有关短而惯用的答案我会使用(需要的Tcl 8.5):

文件重命名{*} [水珠* .STATUS] some_dir

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/

此溶液可与文件与包含名称中的空格,当存在大量的文件等:

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

但需要查找和xargs的其中最常见的是在/ usr / bin中,而不是/ bin中。

作为安全特征使用复杂时“查找”命令和潜在地删除数据我在命令前粘的“回响”,并将其捕获到文件中。结果 然后我可以使用“源”来运行它之前检查文件中列出的命令。

它也处理那些偶然边缘情况下的方式文件手动

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top