tente isto:
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' \;
Eu tenho alguns diretórios que contêm um arquivo com nome semelhante, por exemplo (* Sample_name * .base.coverage.txt). E gostaria de colar todos os arquivos * base.coverage.txt juntos. Eu tenho algo escrito, mas não é certo, já que não acho que estou colando-os juntos.
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
Eu também estou pensando em um método de loop diferente, mas não tenho certeza de como obter a lista de diretórios em uma matriz.
for x in $dir; do cat /$x/*.base.coverage.txt;done > paste_all_l30.p90.base.cov.norm
Qualquer ajuda? obrigado
Tente isto:
find . -type f -name '*.base.coverage.txt' \
| xargs paste > paste_all_l30.p90.base.cov.norm
Isso funcionará enquanto não houver muitos arquivos. Se houver muitos arquivos, então:
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
A melhor maneira de recorrer a vários diretórios seria escrever um script python curto e usar a função os.path.walk
para recursar nos diretórios aninhados. Para acrescentar, você pode usar shutil.copyfileobj
dentro do loop, verificando nomes de arquivos com uma expressão regular.