
У меня есть несколько каталогов, которые содержат файл с похожим названием, например (*Sample_name*.base.coverage.txt). И я хотел бы вставить все файлы *base.coverage.txt вместе. У меня есть что-то записанное, но оно не совсем правильное, так как я не думаю, что я на самом деле вставляю их вместе.
cd /g/bo/vir/analysis
find -type d |
while read dir; do
if [ -f $dir/*.base.coverage.txt ]; then
paste $dir/*.base.coverage.txt >> paste_all_l30.p90.base.cov.norm
fi
done
Я также думаю о другом методе цикла, но не уверен, как поместить список каталогов в массив.
for x in $dir; do cat /$x/*.base.coverage.txt;done > paste_all_l30.p90.base.cov.norm
Есть помощь? Спасибо.
решение1
Попробуй это:
find . -type f -name '*.base.coverage.txt' \
| xargs paste > paste_all_l30.p90.base.cov.norm
Это будет работать, пока файлов не слишком много. Если файлов много, то это:
touch paste_all_l30.p90.base.cov.norm
for file in `find . -type f -name '*.base.coverage.txt'`; do
paste paste_all_l30.p90.base.cov.norm $file > tmp
mv tmp paste_all_l30.p90.base.cov.norm
done
решение2
попробуй это:
find . -type f -name "*.base.coverage.txt" -exec sh -c 'paste {} paste_all_l30.p90.base.cov.norm > tmp ; mv tmp paste_all_l30.p90.base.cov.norm' \;
решение3
Самый простой способ рекурсии по нескольким каталогам — написать короткий скрипт на Python и использовать функцию os.path.walk
для рекурсии по вложенным каталогам. Для добавления можно использовать shutil.copyfileobj
внутри цикла проверку имен файлов с помощью регулярного выражения.