迭代名称中数字范围递增但不连续的文件

迭代名称中数字范围递增但不连续的文件

文件名包含以下形式的模式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只有当所有三个文件都存在时才会成功。

相关内容