Следующее будет работать, но, вероятно, имеет некоторые негативные последствия для безопасности:
echo "You have" * "in current folder"
ИМО лучше, но две строки будут:
files=(*)
echo "You have ${files[@]} in curent folder"
С printf:
files=(*)
printf '%s ' "You have ${files[@]} in current folder"
Попробуйте:
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'
.
Также не забудьте --
отметить конец опций, если вы не можете гарантировать, что имена файлов не будут начинаться с -
.