цикл для вставки определенных файлов в разные каталоги

цикл для вставки определенных файлов в разные каталоги

У меня есть несколько каталогов, которые содержат файл с похожим названием, например (*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внутри цикла проверку имен файлов с помощью регулярного выражения.

Связанный контент