Это сочетание двух команд и некоторого полезного синтаксиса.
glob
возвращает список имен файлов, которые соответствуют шаблону, *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, но сейчас, к счастью, редко используется.