Tenho um palpite de que você pode ter executado o loop mais de uma vez e, como você usa o operador de redirecionamento >> , que acrescenta dados, seus arquivos de resultado crescem sempre.
Em vez disso (e aqui estou evitando usar ls também, veja a discussão em " Por que * não * analisar 'ls'? "por razões):
for name in vanila1/*; do
base_name=${name##*/}
if [ -f "vanila2/$base_name" ]; then
cat "$name" "vanila2/$base_name" >"all_combined/$base_name"
else
printf 'No file in vanila2 corresponds to "%s"\n' "$name" >&2
fi
done
A substituição de variável ${name##*/} transforma um nome de caminho como vanila1/MB.2613.007_0021.ED4_KS1A29-7_338_all em apenas MB.2613.007_0021.ED4_KS1A29-7_338_all , isto é, remove todas as coisas antes de / , incluindo a barra (esse é o componente de nome de arquivo do nome do caminho ou "o nome base "). Isso pode ser substituído por $(basename "$name") .
Se houver um arquivo em vanila2 correspondente ao nome selecionado em vanila1 , os dois serão concatenados e colocados no diretório all_combined . Caso contrário, há uma mensagem de diagnóstico sobre esse fato.
Usando > em vez de >> , qualquer arquivo existente em all_combined com o mesmo nome será substituído em vez de anexado a.
Se você tiver outros arquivos ou diretórios em vanila1 , poderá modificar o padrão vanila1/* no loop para algo que corresponda apenas aos arquivos em que está interessado, por exemplo exemplo vanila1/*_all ou similar.