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

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

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

/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 под рукой нет -,-.

решение1

Вы все еще можете использовать подстановку в Bourne Shell

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

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

решение2

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

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

решение3

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

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

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*

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

решение4

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

Связанный контент