Установите переменную в имя файла, используя glob - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть каталог, который содержит другой каталог с именем ABC_<version number>

Я бы хотел указать свой путь к тому, что ABC_<version number> окажется (в файле модуля)

Как сделатьЯ использую glob в TCL, чтобы получить имя нужного каталога и поместить его в переменную TCL?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Команда 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 для получения только реальных файлов.

0 голосов
/ 25 февраля 2019

Оказывается, ответ был:

 set abc_path [glob -directory $env(RELDIR) ABC_*]

Нет необходимости в кавычках по всему пути.-directory controls, куда вы смотрите.

Позже в файле модуля

 append-path PATH $abc_path
...