bucle para pegar archivos específicos en diferentes directorios

bucle para pegar archivos específicos en diferentes directorios

I algunos directorios que contienen un archivo con un nombre similar, por ejemplo (*Sample_name*.base.coverage.txt). Y me gustaría pegar todos los archivos *base.coverage.txt juntos. Tengo algo escrito, pero no está del todo bien porque no creo que los esté pegando 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

También estoy pensando en un método de bucle diferente, pero no estoy seguro de cómo obtener la lista de directorios en una matriz.

for x in $dir; do cat /$x/*.base.coverage.txt;done > paste_all_l30.p90.base.cov.norm

¿Alguna ayuda? gracias

Respuesta1

Prueba esto:

find . -type f -name '*.base.coverage.txt' \
  | xargs paste > paste_all_l30.p90.base.cov.norm

Esto funcionará siempre que no haya demasiados archivos. Si hay muchos archivos, entonces esto:

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

Respuesta2

prueba esto:

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' \;

Respuesta3

Lo más fácil para recurrir a varios directorios sería escribir un breve script en Python y utilizar la os.path.walkfunción para recurrir a los directorios anidados. Para agregar, puede usar shutil.copyfileobjdentro del bucle, verificar los nombres de archivos con una expresión regular.

información relacionada