i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
Eu não acho que isso seja tão complicado quanto tudo isso - você já fez o trabalho duro ao pedir os nomes dos arquivos. Apenas não abra todos eles ao mesmo tempo, é tudo.
Outra maneira:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
... mas acho que isso os faz para trás ... Isso pode funcionar melhor:
i=0; echo 'while paste \'
until [ "$((i+=1))" -gt 1023 ] &&
printf '%s\n' '"${1024}"' \
do\ shift\ 1024 done
do echo '"${'"$i"'-/dev/null}" \'
done | sh -s -- ./res.* >outfile
E aqui ainda está outra forma:
tar --no-recursion -c ./ |
{ printf \0; tr -s \0; } |
cut -d '' -f-2,13 |
tr './fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
\n' '\n\t' >outfile
Isso permite que tar
reúna todos os arquivos em um fluxo delimitado por nulo, analisa todos os metadados de cabeçalho, mas o nome do arquivo, e transforma todas as linhas em todos os arquivos em guias. No entanto, ele depende da entrada de arquivos de texto reais - o que significa que cada um termina com uma nova linha e não há bytes nulos nos arquivos. Ah - e também depende dos próprios nomes dos arquivos serem sem nova linha (embora isso possa ser manuseado de forma robusta com a opção tar
do% co do GNU%) . Se essas condições forem atendidas, o trabalho de qualquer número de arquivos será muito curto - e --xform
fará quase tudo.
O resultado é um conjunto de linhas que se parecem com:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
E assim por diante.
Eu testei primeiro criando 5 arquivos de teste. Eu realmente não me sinto com vontade de fazer 10000 arquivos agora, então eu fui um pouco maior para cada um - e também assegurei que o arquivo comprimentos diferisse bastante. Isso é importante ao testar tar
scripts porque tar
bloqueará a entrada para comprimentos fixos - se você não tentar pelo menos alguns comprimentos diferentes, nunca saberá se realmente lidará com apenas um.
De qualquer forma, para os arquivos de teste que fiz:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
tar
informado posteriormente:
tar --no-recursion -c ./ |
{ printf \0; tr -s \0; }|
cut -d '' -f-2,13 |
tr './1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
./5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
\n' '\n\t' | cut -f-25
... então eu corri ...
i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
... apenas para mostrar apenas os primeiros 25 campos delimitados por tabulações por linha (porque cada arquivo é uma única linha - há um lote ) ...
A saída foi:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile