Bash выполняет итерацию по парам файлов

Попробуйте следующее:

xmlstarlet sel -t -v //Output_Path -nl data.xml
3
16.03.2016, 00:50
2 ответа
  1. Один из подходов - выполнить

     для файла в * x.txt 
    do 
    bfile = $ {afile / a / b}; bfile = $ {bfile / x.txt / y.txt} 
    cfile = $ {файл / a / c}; cfile = $ {cfile / x.txt / z.txt} 
     
    my_command "$ afile" "$ bfile" "$ cfile" 
    готово 
     

    хотя я полагаю, что это небольшое улучшение, и оно могло бы потерпеть неудачу в патологическом случае, например, с именем файла afoox.txtbarx.txt . Также обратите внимание, что это особенность bash; она может не работать в других POSIX-совместимых оболочках (в отличие от ## и % , которые указаны в POSIX).

  2. Легко сказать

      if [-f "$ bfile"] 
    then 
    my_command "$ afile" "$ bfile" "$ cfile" 
    else 
    echo Error 
    fi 
     

    , чтобы поймать a выбросы файла (например, a17x.txt без соответствующего b17y.txt ).

  3. Если вы поместите

     для файла # без списка, по умолчанию будет "$ @"; т.е., аргументы сценария 
    do 
    bfile = $ {afile / a / b}; bfile = $ {bfile / x.txt / y.txt} 
    cfile = $ {файл / a / c}; cfile = $ {cfile / x.txt / z.txt} 
     
    если [-f "$ bfile"] 
    , то 
    my_command "$ afile" " $ bfile "" $ cfile "
    else 
    echo Error 
    fi 
    done 
     

    в сценарии, затем вы можете запустить этот сценарий со списком num x.txt имен файлов в качестве аргументов, и он их обработает. Затем вы можете запустить этот сценарий через xargs или parallel .

  4. Проверка выбросов файла b (например, b42y.txt без соответствующего a42x.txt ) в рамках вышеуказанного процесса. - это непросто, но легко выполнить отдельный цикл:

     для bfile в b * y.txt 
    do 
    afile = $ {bfile / b / a }; afile = $ {afile / y.txt / x.txt} 
    если [! -f "$ afile"] 
    затем 
    echo Error 
    fi 
    done 
     
2
27.01.2020, 21:18

GNU parallel имеет способ сделать это и выполняет команды параллельно в качестве бонуса:

$ parallel my_command {} \
                      {= s/a([0-9]+)x.txt/b\1y.txt/ =} \
                      {= s/a([0-9]+)x.txt/c\1z.txt/ =} \
           ::: a*x.txt

Эти замены являются кодом Perl. Разрывы строк предназначены только для удобства чтения - это однострочный текст.

2
27.01.2020, 21:18

Теги

Похожие вопросы