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командой?