我正在学习tcl(期待),现在我遇到了一个有趣的问题。我需要一个命令来移动/重命名一堆扩展名为.status的文件。我试过这些:
spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
当然,这不起作用。我google了一下,发现了一些关于glob的东西,但它似乎不像我想要的那样工作。如果我这样做:
exec /bin/mv [glob *.status] somedir
mv 抱怨'1.status 2.status 3.status ......等等'。不是有效的文件。就好像整个文件列表在一个字符串中连接而不是单独处理。
试图通过谷歌找到更多信息引导我到很多破碎和过时的链接,所以我希望在解决这个问题的同时,你能指点我一些好的在线资源来获取tcl / expect基础知识和常见的陷阱。 / p>
更新:只接受在/ bin中使用标准tcl和标准工具的解决方案。
答案 0 :(得分:5)
兰迪的回答简短而正确,但不需要使用执行官。 约瑟夫的回答非常强大,但有点长。
对于我将使用的简短且惯用的答案(需要Tcl 8.5):
文件重命名{*} [glob * .status] some_dir
答案 1 :(得分: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/
答案 2 :(得分:1)
$ 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
答案 3 :(得分:0)
当存在大量文件等时,此解决方案适用于名称包含空格的文件:
exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir
但它需要find和xargs,它们通常位于/ usr / bin中,而不是/ bin。
答案 4 :(得分:0)
作为一种安全功能,当使用复杂的“查找”命令并可能删除数据时,我会在命令前面贴上“echo”并将其捕获到文件中。
然后,我可以在使用“source”运行它之前检查文件中列出的命令。
这也是一种手动处理偶尔边缘案例文件的方法。