копирование каталога с определенным файлом - PullRequest
0 голосов
/ 12 июня 2019

Я (очень четко) не знаю Баш.Если это излишний вопрос, я буду признателен за указание в правильном направлении - извинения, если я не нашел подходящей темы.Спасибо, как всегда.

У меня есть файловая структура следующим образом:

/quants
   sample1
      a bunch of extra stuff
      aux_info
         unmapped_names.txt
   sample2
      a bunch of extra stuff
      aux_info
         unmapped_names.txt
   sample3
      a bunch of extra stuff
      aux_info
         unmapped_names.txt

в каждом примере подкаталогов, есть больше каталогов и файлов, чем только aux_info и unmapped_names.txt, но онивот те, которые я заинтересован в копировании.

Приведенный ниже метод создает новый каталог без отображения внутри / quants.В результате получается следующее:

/quants
   sample1
      a bunch of extra stuff
      aux_info
         unmapped_names.txt
   sample2
      a bunch of extra stuff
      aux_info
         unmapped_names.txt
   sample3
      a bunch of extra stuff
      aux_info
         unmapped_names.txt
   unmapped
      sample1
         unmapped_names.txt
      sample2
         unmapped_names.txt
      sample3
         unmapped_names.txt

Код ниже работает, но он очень медленный.Буду признателен за предложения о том, как сделать это более эффективно.

getUnmapped(){
# =====================================================================
# description: create new dir called unmapped
# input: quant filepath (output from mapSalmon)
# output: 
# =====================================================================

# enable glob (for mac)
shopt -s extglob

# store original workingDir
local workingDir=$(pwd)
# store list of all directories (sample_rep names) in quant dir
local sample_dirs=$1/*

# cd to inputted quants dir
cd $1

# create directory in quants dir called unmappped
mkdir unmapped
cd unmapped

# create sample_rep directories in unmapped
for sample_rep in $sample_dirs;
  do
    if [ $(basename ${sample_rep%_quant}) != "unmapped" ]
      then
        local sample_file=$(basename ${sample_rep%_quant})
        mkdir $sample_file
        cp $sample_rep/aux_info/unmapped_names.txt ${1}/unmapped/${sample_file}
      fi
  done

cd $workingDir

} # end getUnmapped

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Возможно, вы захотите сделать это на языке программирования с, возможно, встроенным параллелизмом. В противном случае вы можете использовать командную параллель, возможно: https://unix.stackexchange.com/questions/211976/how-to-run-x-instances-of-a-script-parallel

Я сам не уверен в тонкостях, связанных с параллелью, ноэто должно по крайней мере начать максимизировать использование ресурсов.Вы можете установить параллель на Mac, используя Brew: https://brew.sh/

0 голосов
/ 12 июня 2019

Сколько файлов вы обрабатываете?

Одна вещь, которую вы можете сделать, - это предварительно вычислить и сохранить выражение:

$ (basename $ {sample_rep% _quant}) *

например:

sample_file = $ (basename $ {sample_rep% _quant})

Затем в своем коде замените выражение на $ sample_file.Это избавит вас от оценки выражения дважды.Однако я не думаю, что именно поэтому он работает медленно, поскольку производительность, вероятно, ограничена входом / выходом файловой системы Mac.

При больших файлах размером 800 МБ копирование будет медленным.В этом случае символическая ссылка с 'ln -s ...' вместо этого будет намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...