如何解决路径的正确结尾?

如何解决路径的正确结尾?

我有一个保存此路径的 shell 变量

/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 Expansion -,-。

答案1

你仍然可以在 Bourne Shell 中进行通配符

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

最好尽可能多地使用 Bourne shell 语法编写 shell 脚本;这样可以最大程度地提高可移植性。在许多情况下,它还可以提高速度。

答案2

如果您知道可能的扩展列表,您可以执行以下操作:

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

答案3

我相信 Christian 走的是正确的路。如果您至少确定了路径的一部分,那么使用 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*

由于通配符可以产生多个结果,因此您的“处理”函数应该能够对多个参数进行操作。在我的示例中,您可以看到我如何通过迭代 $@ 中的每个参数来执行此操作。

答案4

当你只有一个文件时,你可以使用 bash globbingprocess ${path}*

相关内容