Как определить правильное окончание пути?

Я получил переменную оболочки, содержащую этот путь

/usr/share/man/man1/bitmap.1

Может быть файл с именем bitmap.1, но также может быть bitmap.1.z, bitmap.1.gz, bitmap.1.Z.

Теперь я хочу передать реальный файл функции, одновременно решая правильный файл, как

function process {
    # do something
}

path="/usr/share/man/man1/bitmap.1"

process ${path}.(z|Z|gz) # here the shell shall resolve the real filename

Есть ли способ сделать это элегантно, или я должен проверить, если bitmap.1, bitmap.1.z и т. Д. Выйти и затем передать этот файл в функцию???


Не забудьте упомянуть, что я ограничен Bourne-Shell, так что никакого расширения Brace нет под рукой -,-.

4 ответа

Решение

Вы все еще можете делать сглаживание в Bourne Shell

for f in ${given-path}*; do
process $f
done

Хорошая идея - использовать как можно больше сценариев оболочки, ограничивая синтаксис оболочки Bourne; это максимизирует портативность. Во многих случаях это также улучшает скорость.

Если вы знаете список возможных расширений, вы можете сделать:

process ${path}{,.Z,.Z,.gz}

Я верю, что Кристиан на правильном пути. Если вы уверены, что, по крайней мере, часть вашего пути, использование встроенной глобализации Bash приведет к любым файлам, соответствующим вашему шаблону.

Например, у меня есть функция в моем.profile, которую я часто использую для отслеживания gzipped и текстовых файлов журнала:

function mscat {
  is_gzip="\.gz$"

  for file in $@; do
    if [[ "$file" =~ $is_gzip ]]; then
      zcat $file
    else
      cat $file
    fi
  done
}

Который я бы назвал так:

mscat /var/log/ncftpd/sess.2010*

Поскольку глобализация может дать более одного результата, ваша функция "процесс" должна быть способна воздействовать на несколько аргументов. В моем примере вы можете увидеть, как я это делаю, перебирая каждый аргумент в $@.

Когда у вас есть только один файл, вы можете использовать bash globbing process ${path}*

Другие вопросы по тегам