Se quiser combiná-los e os nomes dos arquivos forem conhecidos de antemão, você poderá tentar algo como:
for i in a b c d
do
find <root direcoty> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done
Para cada um, b, c, ed procuramos os arquivos que têm o nome a.txt (b.txt ... d.txt) em todos os diretórios e invocamos cat nos nomes dos arquivos e canalizamos Saída para um arquivo com o mesmo nome sob o diretório raiz.
Se eles não são conhecidos de antemão, fica um pouco complicado, mas aqui:
for i in 'find <root directory> -type f | sed -E 's!\./.*/([a-zA-Z0-9]+)\.txt!!g''
do
find <root directory> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done
É o mesmo que o comando anterior, exceto de onde obtemos nossa lista. Primeiramente, obtemos uma lista de todos os arquivos no diretório raiz e, em seguida, removemos todas as partes dos nomes dos arquivos para incluir apenas o nome do arquivo, eh, (sem direcotry e sem extensão). Você deve observar que isso funcionará apenas para arquivos que possuem letras maiúsculas e minúsculas misturadas com números como seus nomes, sem traços ou sob pergaminhos. Se você quiser, altere [a-zA-Z0-9]
para [a-zA-Z0-9-_]
.
Altere qualquer instância de <root directory>
para o caminho desejado.