题
我学习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中。
作为安全特征使用复杂时“查找”命令和潜在地删除数据我在命令前粘的“回响”,并将其捕获到文件中。结果 然后我可以使用“源”来运行它之前检查文件中列出的命令。
它也处理那些偶然边缘情况下的方式文件手动
不隶属于 StackOverflow