Вам нужно будет сделать это в два этапа:
С кодом:
Найти все файлы Fasta (предполагается нормальное имя файла без встроенных новых строк):
find. -type f -path '*/seq/in/*.fasta' -exec basename {} ';' | sort -u -o file.list
Затем для каждого имени соедините все файлы с таким же именем. Полученные файлы будут помещены в каталог new
в текущем каталоге. Имя нового файла будет таким же, как и у объединенных файлов.
mkdir new
while read -r name; do
find. -type f -path "*/seq/in/$name" -exec cat {} + >"new/$name"
done <file.list
То, что вы могли бы добавить к каждому из find
вызовов, это-mindepth 6 -maxdepth 6
(или соответствующая глубина, 6 может отличаться на единицу ), так что все файлы взяты с той же глубины в файловой иерархии. Вставьте эти параметры непосредственно перед -type f
.
Альтернатива, предложенная steeldriver в комментариях, которая обходит создание отдельного списка имен файлов Fasta:
mkdir new
find. -type f -path '*/seq/in/*.fasta' \
-exec sh -c 'for pathname do cat "$pathname" >>"new/${pathname##*/}"; done' find-sh {} +
В bash, если включена расширенная подстановка, вы можете использовать ! (abc )на инверсию -соответствует каталогу abc
. Бывший. дано
$ tree
.
├── abc
│ ├── def
│ ├── ghi.txt
│ └── jkl
├── def
│ ├── abc
│ ├── abc.txt
│ └── f01
└── ghi.txt
2 directories, 7 files
и
$ shopt extglob
extglob on
, затем
$ ls !(abc)
ghi.txt
def:
abc abc.txt f01