упрощение цикла for

Следующее будет работать, но, вероятно, имеет некоторые негативные последствия для безопасности:

echo "You have" * "in current folder"

ИМО лучше, но две строки будут:

files=(*)
echo "You have ${files[@]} in curent folder"

С printf:

files=(*)
printf '%s ' "You have ${files[@]} in current folder"
0
06.03.2020, 07:09
1 ответ

Попробуйте:

for i in *.rem.1.fq; do
    cat -- "$i" "${i%.1.fq}.2.fq" > "${i%.1.fq}.b.fq"
done

Возможно добавить проверку на наличие файлов:

for i in *.rem.1.fq; do
    if [ -e "${i%.1.fq}.2.fq" ] && [ ! -e "${i%.1.fq}.b.fq" ]; then
        cat -- "$i" "${i%.1.fq}.2.fq" > "${i%.1.fq}.b.fq"
    fi
done

Метод, представленный в вопросе, подвержен ошибкам -— если файл содержит пробел, второй цикл forможет работать неправильно.

cut -f 1 -d.разрезает строку на поля (, разделенные в данном случае .), и выводит запрошенные поля (, в данном случае только первые ). Если задана строка file 1.whatever, будет выведено file 1. Опять же, это чревато ошибками, учитывая, что шаблон глобуса *rem*.1.fqможет возвращать имена файлов с anyremthing.1.fq— подстановочный знак *соответствует чему угодно (, включая ничего).

Лучшим вариантом является выполнение одного цикла и использование расширения параметра с некоторой формой подстановки внутри цикла для сопоставления с другими файлами с соответствующими именами.

  • Выше используется шаблон глобуса *.rem.1.fq— вы можете сузить его еще больше — например. file[0-9].rem.1.fq.
  • ${param%string}используется в цикле для удаления суффикса .1.fq. Многие оболочки также поддерживают другие формы подстановок расширения параметров, например. ${param/string/repl}.

Также, как правило, рекомендуется заключать в кавычки все замены "$param"или "$(command)"— в противном случае большинство оболочек будут применять разбиение полей и генерацию имени файла, и вы можете в конечном итоге попытаться, например, cat file 1вместо cat 'file 1'.

Также не забудьте --отметить конец опций, если вы не можете гарантировать, что имена файлов не будут начинаться с -.

3
28.04.2021, 23:21

Теги

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