如何解決路徑的正確結局?

如何解決路徑的正確結局?

我有一個 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,所以手邊沒有支撐延伸 -,-。

答案1

您仍然可以在 Bourne Shell 中進行通配操作

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

最好將盡可能多的 shell 腳本限制為 Bourne shell 語法;最大限度地提高了便攜性。在許多情況下,它還可以提高速度。

答案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*

由於通配符可以產生多個結果,因此您的“處理”函數應該能夠對多個參數進行操作。在我的範例中,您可以透過迭代 $@ 中的每個參數來了解我是如何做到這一點的。

答案4

當你只有一個檔案時,你可以使用 bash globbingprocess ${path}*

相關內容