i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
Nie wydaje mi się, żeby było to tak skomplikowane - wykonałeś już ciężką pracę, zamawiając nazwy plików. Tylko nie otwieraj ich wszystkich jednocześnie, to wszystko.
Inny sposób:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
... ale myślę, że robi to wstecz ... To może działać lepiej:
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
A oto jeszcze jeden sposób:
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' >outfile
Pozwala tar
to zebrać wszystkie pliki w strumieniu rozdzielanym zerami, analizuje wszystkie metadane nagłówka oprócz nazwy pliku i przekształca wszystkie wiersze we wszystkich plikach w tabulatory. Opiera się jednak na tym, że dane wejściowe są rzeczywistymi plikami tekstowymi - co oznacza, że każdy kończy się na nowej linii i nie ma w bajtach pustych. Aha - i to również opiera się na nazwach będących nowalinia same wolne (choć które mogą być obsługiwane solidnie z GNU tar
„s --xform
opcja) . Biorąc pod uwagę, że te warunki są spełnione, powinien bardzo szybko pracować z dowolną liczbą plików - i tar
wykona prawie wszystkie.
Wynikiem jest zestaw linii, które wyglądają następująco:
./fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
I tak dalej.
Przetestowałem to, tworząc najpierw 5 plików testowych. Tak naprawdę nie miałem ochoty na generowanie 10000 plików, więc po prostu zwiększyłem trochę dla każdego z nich - i upewniłem się, że długości plików różnią się znacznie. Jest to ważne podczas testowania tar
skryptów, ponieważ tar
blokuje wejście do ustalonych długości - jeśli nie spróbujesz przynajmniej kilku różnych długości, nigdy nie dowiesz się, czy faktycznie poradzisz sobie tylko z jedną.
W każdym razie dla plików testowych zrobiłem:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
ls
później zgłoszono:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
... wtedy pobiegłem ...
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; }|
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' | cut -f-25
... aby wyświetlić tylko pierwsze 25 pól rozdzielanych tabulatorami w linii (ponieważ każdy plik jest pojedynczą linią - jest ich dużo ) ...
Wynik był:
./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
--serial
opcji zpaste
poleceniem?