Команда glob
расширяет подстановочные знаки, но выдает список Tcl всего, что соответствует, поэтому вам нужно быть немного осторожнее.Более того, порядок списка «случайный» - он зависит от необработанного порядка записей в структуре каталогов ОС, что в общем случае сложно предсказать - так что вам действительно нужно решить, что вы хотите.Кроме того, если вам нужен только один элемент списка, вы должны использовать lindex
(или lassign
в вырожденном режиме работы), чтобы выбрать его: в противном случае ваш код взорвется при обнаружениипользователь, который помещает специальные символы (пробел или один из небольшого списка других) в путь.Это выгодно с самого начала.
Например, если вы хотите сопоставить только один элемент и в противном случае вывести ошибку, вам следует сделать следующее:
set thePaths [glob -directory $theDir -type d ABC_*]
if {[llength $thePaths] != 1} {
error "ambiguous match for ABC_* in $theDir"
}
set theDir [lindex $thePaths 0]
Если вместо этого вы хотитедля сортировки по номеру версии и выбора (предположительно) новинок вы можете использовать lsort -dictionary
.Внутренне это довольно волшебно (серьезно; читайте документы, если вы хотите увидеть, что оно на самом деле делает), но делает все правильно со всеми разумными схемами номеров версий.
set thePaths [glob -directory $theDir -type d ABC_*]
set theSortedPaths [lsort -dictionary -decreasing $thePaths]
set theDir [lindex $theSortedPaths 0]
Теоретически вы можете сделать пользовательскую сортировкуфактическая дата в каталогах, но она более сложная и может иногда удивлять, когда вы выполняете обслуживание системы.
Обратите внимание на использование -type d
в glob
.Это фильтр типа , который отлично подходит в этом случае, когда вы явно хотите получить только имена каталогов.Другой основной полезный параметр (в общем случае) - это -type f
для получения только реальных файлов.