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.