i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
Non penso che sia così complicato - hai già fatto il duro lavoro ordinando i nomi dei file. Basta non aprirli tutti contemporaneamente, tutto qui.
Un altro modo:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
... ma penso che li faccia all'indietro ... Questo potrebbe funzionare meglio:
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
Ed ecco ancora un altro modo:
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' >outfile
Ciò consente tar
di raccogliere tutti i file in un flusso delimitato da zero per te, analizza tutti i suoi metadati di intestazione tranne il nome file e trasforma tutte le righe di tutti i file in schede. Si basa sul fatto che l'input sia un vero e proprio file di testo, il che significa che ognuno termina con una nuova riga e non ci sono byte nulli nei file. Oh - e si basa anche sul fatto che i nomi dei file stessi siano privi di newline (sebbene ciò possa essere gestito in modo robusto con tar
l' --xform
opzione GNU ) . Dato che queste condizioni sono soddisfatte, dovrebbe rendere molto breve qualsiasi numero di file - e tar
farà quasi tutto.
Il risultato è un insieme di linee che sembrano:
./fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
E così via.
L'ho provato creando prima 5 file di test. In realtà non mi andava di generare 10000 file in questo momento, quindi sono andato un po 'più grande per ciascuno di essi e ho anche assicurato che le lunghezze dei file differivano di molto. Questo è importante durante il test degli tar
script perché tar
bloccherà l'input a lunghezze fisse - se non provi almeno alcune lunghezze diverse non saprai mai se in realtà gestirai solo quella.
Ad ogni modo, per i file di test ho fatto:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
ls
successivamente riportato:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
... poi ho corso ...
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; }|
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' | cut -f-25
... solo per mostrare solo i primi 25 campi delimitati da tabulazioni per riga (poiché ogni file è una singola riga - ce ne sono molti ) ...
L'output è stato:
./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
opzione con ilpaste
comando?