Cria novos arquivos concatenados de mesmo nome em vários diretórios

0

Eu tenho muitos arquivos com o mesmo nome distribuídos em muitos subdiretórios com nomes diferentes (embora todos no mesmo nível). Eu gostaria de concatenar todos os arquivos do mesmo em um novo arquivo com esse nome. Eu gostaria que este novo arquivo estivesse no diretório pai.

Eu já tentei algumas respostas postadas aqui no SE: Como mover arquivos com o mesmo nome e concatenar

Veja o que tentei e os problemas:

find */*/*/seq/in/ -type f -name '*.fasta' -exec bash -c 'cat "{}" >> new_file' \;

Isso concatenou todos os arquivos com o sufixo .fasta, em um arquivo chamado new_file, não apenas com nomes correspondentes.

for file in */*/*/seq/in/*.fasta; 
do 
cat "$file" >> "$file.cat" done

Isso apenas fez uma cópia de cada arquivo no mesmo subdiretório original e o anexou com .cat

O que estou fazendo de errado? Muito obrigado!

    
por user284583 05.04.2018 / 17:55

1 resposta

3

Você terá que fazer isso em duas etapas:

  1. Encontre todos os nomes de arquivos originais do Fasta.
  2. Para cada nome, encontre todos os arquivos com esse nome e concatene-os.

com código:

Encontre todos os arquivos do Fasta (isto assume o nome do arquivo sã sem novas linhas embutidas):

find . -type f -path '*/seq/in/*.fasta' -exec basename {} ';' | sort -u -o file.list

Em seguida, para cada nome, concatene todos os arquivos com o mesmo nome. Os arquivos resultantes serão colocados no diretório new no diretório atual. O nome do novo arquivo será o mesmo dos arquivos concatenados.

mkdir new
while read -r name; do
    find . -type f -path "*/seq/in/$name" -exec cat {} + >"new/$name"
done <file.list

A coisa que você pode deseja adicionar a cada uma das invocações find é -mindepth 6 -maxdepth 6 (ou a profundidade apropriada, 6 pode estar desativada em um), para que os arquivos fiquem todos tiradas da mesma profundidade na hierarquia de arquivos. Insira essas opções antes de -type f .

Alternativa sugerida pela steeldriver nos comentários, que ignora a criação de uma lista separada de nomes de arquivos Fasta:

mkdir new
find . -type f -path '*/seq/in/*.fasta' \
    -exec sh -c 'for pathname do cat "$pathname" >>"new/${pathname##*/}"; done' find-sh {} +
    
por 05.04.2018 / 18:13