for name in./*.fastq.gz; do
rnum=${name##*_}
rnum=${rnum%%.*}
sample=${name#*_}
sample=${sample%%_*}
cat "$name" >>"${sample}_$rnum.fastq.gz"
done
Это перебирает все сжатые файлы Fastq в текущем каталоге и извлекает имя примера в переменную оболочки sample
. Для всех имен файлов, показанных в вопросе, это будет 102697-001-001
.
Переменная rnum
будет содержать бит R#
в конце имени файла.
Имя образца извлекается путем взятия имени файла и удаления всего до первого символа _
включительно, а затем удаления всего после первого символа _
включительно из этого результата. Аналогичным образом извлекается значение переменной rnum
.
Затем файл просто добавляется в конец агрегированного файла с помощью cat >>
. Имя выходного файла будет состоять из имени образца, R#
и строки .fastq.gz
. Для показанных файлов это будет 102697-001-001_R1.fastq.gz
.
Сжатые файлы Gzip не обязательно распаковывать, чтобы объединить их. Распаковка полученного файла даст вам несжатую конкатенацию всех файлов Fastq.
Альтернативный способ сделать это с помощью bash
, используя регулярное выражение для определения имени выходного файла:
for name in./*.fastq.gz; do
if [[ "$name" =~ _([0-9-]+)_.*(..)\.fastq\.gz ]]; then
outfile="${BASH_REMATCH[1]}_${BASH_REMATCH[2]}.fastq.gz"
cat "$name" >>"$outfile"
fi
done
Имя файла сопоставляется с регулярным выражением
_([0-9-]+)_.*(..)\.fastq\.gz
Две группы (битов в круглых скобках )будут выбирать для нас соответствующие части имени файла. Первая группа захватывает строку, которая состоит только из символов, которые являются либо цифрами, либо тире. Эта группа должна быть окружена _
с обеих сторон. Единственное место в имени файла, которому соответствует этот бит, — это имя образца.
После первой группы и _
после нее мы допускаем любое количество любых символов(.*
)до бита (..)\.fastq\.gz
. \.fastq\.gz
будет соответствовать строке .fastq.gz
в конце имени файла, поэтому последняя группа (..)
,захватывает R1
непосредственно перед этим (, шаблон .
будет соответствовать любому символу, а \.
будет соответствовать точке ).
Две захваченные группы сохраняются как индексы 1 и 2 в BASH_REMATCH
массиве (имя является сокращением от «Bash Regular Expression Match» ), и мы используем их при построении имени выходного файла.
Установите их оболочку на /bin/false
с помощью chsh
. например. (как корень):
chsh -s /bin/false username
Это не позволит им получить оболочку при входе в систему через консоль или через ssh и т. д. Этого достаточно для большинства целей, но если они могут запускать другие программы в системе, у них есть много других способов получить как ад.
Это также эффективно предотвратит их вход в систему вообще, поэтому, если это не пользователь системы, предназначенный для запуска определенного демона (, например. www -данные для запуска apache )или его почтовый ящик -только пользователь или аналогичный, нет особого смысла в том, чтобы пользователь вообще имел учетную запись.
Другой, возможно, лучший вариант — настроить их оболочку на ограниченную оболочку , такую как /bin/rbash
, которая позволяет им запускать программы только в их (предварительном -наборе )PATH и запрещает им изменять каталог с помощью cd
или изменять переменные среды, такие как SHELL
, PATH
и т. д. Подробности см. в man rbash
.
напр. вы можете создать каталог где-нибудь в системе (, например. /usr/local/rbin ), скопируйте или свяжите в него разрешенные двоичные файлы и установите их PATH так, чтобы они могли запускать только программы, найденные в этом каталоге. Вы должны быть осторожны, какие программы вы помещаете в этот каталог -, например. установите rvim
вместо vim
, если им нужен текстовый редактор (rvim не позволяет выполнять команды оболочки ).
ПРИМЕЧАНИЕ. :Это потребует много работы и требует тщательного исследования, чтобы сделать все правильно (, т. е. чтобы не оставить лазейку, позволяющую получить доступ к оболочке ). На этом сайте есть несколько вопросов и ответов о rbash
и других ограниченных оболочках. Начните свое исследование с:
https://unix.stackexchange.com/search?q=rbash
и очень тесно связанная темаchroot
: