i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
Я не думаю, что это так сложно, как все - вы уже проделали тяжелую работу, заказав имена файлов. Только не открывайте их все одновременно, вот и все.
Другой путь:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
... но я думаю, что это делает их в обратном направлении ... Это может работать лучше:
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
И вот еще один способ:
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' >outfile
Это позволяет tar
собрать все файлы в поток с нулевым разделением для вас, проанализировать все метаданные заголовка, кроме имени файла, и преобразовать все строки во всех файлах во вкладки. Тем не менее, он полагается на то, что входные данные являются фактическими текстовыми файлами, то есть каждый из них заканчивается символом новой строки и в файлах нет нулевых байтов. Да, и это также зависит от того, что сами имена файлов не имеют перевода строки (хотя это может быть надежно обработано tar
с помощью --xform
опции GNU ) . Учитывая эти условия, он должен очень быстро работать с любым количеством файлов - и tar
сделает почти все.
Результатом является набор строк, которые выглядят так:
./fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
И так далее.
Я проверил это, сначала создав 5 тестовых файлов. На самом деле я не чувствовал, что сейчас создаю 10000 файлов, поэтому я стал немного больше для каждого - и также убедился, что длины файлов сильно различаются. Это важно при тестированииtar
сценариев, поскольку tar
блокирует ввод данных фиксированной длины - если вы не попробуете хотя бы несколько разных длин, вы никогда не узнаете, будете ли вы обрабатывать только одну из них.
Во всяком случае, для тестовых файлов я сделал:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
ls
впоследствии сообщили:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
... тогда я побежал ...
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; }|
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' | cut -f-25
... просто чтобы показать только первые 25 полей с разделителями табуляции в строке (потому что каждый файл - это одна строка - их много ) ...
Выход был:
./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
опцию сpaste
командой?