迭代名稱中數字範圍遞增但不連續的文件

迭代名稱中數字範圍遞增但不連續的文件

檔案名稱包含以下形式的模式00035023030,僅在最後兩位數字中從...30到發生變化。但如果like say中...35漏掉了一個數字,就會拋出錯誤。如何繞過此錯誤並循環運行以下命令列表?303531

barycorr是詢問我三個輸入的程式:

  1. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
  2. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
  3. /home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz

我為每個運行創建的腳本文件:

echo -e "/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023030/auxil/sw00035023030sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl.evt
/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023031/auxil/sw00035023031sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

echo -e "/home/dinesh/Test/output00035023033/sw00035023033xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023033xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log

答案1

您的腳本不會停止並將運行所有命令。您所需要做的就是忽略該錯誤。但是,您確實可以使其跳過丟失的檔案。例如,您可以像這樣重寫腳本(假設 bash 版本 4 或更高版本,用於大括號擴充中的零填充):

#!/bin/bash

for num in {00035023030..00035023033}; do
    dir=/home/dinesh/Test/output"${num}"
    file1="$dir/sw${num}xwtw2po_cl.evt"
    file2="$dir/sw${num}xwtw2po_cl_bary.evt"
    file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"

    if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
        printf '%s %s %s' "$file1" "$file2" "$file3" | 
            barycorr ra=253.467570 dec=39.760169 &>>log
    else
        echo "Some files missing for $num" >> log
    fi
done

解釋

  • for num in {00035023030..00035023033}; do:此{start..end}表示法稱為“大括號擴展”,並將擴展為從start到 的所有數字end

    $ echo {00035023030..00035023033}
    00035023030 00035023031 00035023032 00035023033
    

for variable in something是一個 for 循環,它將變數的值($num在本例中為 )設為每個「東西」。這意味著該循環將迭代從 00035023030 到 0035023033 的數字。

  • 在循環內部,我們只需設定一些變量,以避免需要編寫很長的名稱並保持一切乾淨。所以我們有:

     dir=/home/dinesh/Test/output"${num}"
     file1="$dir/sw${num}xwtw2po_cl.evt"
     file2="$dir/sw${num}xwtw2po_cl_bary.evt"
     file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"
    

    ${num}需要這樣 shell 才能理解類似的事情,sw${num}xwtw2po_cl_bary.evt因為sw$numxwtw2po_cl_bary.evtshell 無法知道變數的名稱是$num或不是$numxwtw2po_cl_bary.evt

  • if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then:這if只是檢查所有三個文件是否存在。正在-e檢查文件是否存在。因此,if只有當所有三個文件都存在時才會成功。

相關內容