i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
Ich denke nicht, dass dies so kompliziert ist wie das alles - Sie haben bereits die harte Arbeit geleistet, indem Sie die Dateinamen bestellt haben. Nur nicht alle gleichzeitig öffnen, ist alles.
Ein anderer Weg:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
... aber ich denke das macht sie rückwärts ... Das könnte besser funktionieren:
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
Und hier ist noch ein anderer Weg:
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' >outfile
Auf diese Weise können Sie tar
alle Dateien in einem durch Nullen getrennten Stream zusammenfassen, alle Header-Metadaten mit Ausnahme des Dateinamens analysieren und alle Zeilen in allen Dateien in Registerkarten umwandeln. Es ist jedoch darauf angewiesen, dass es sich bei den Eingaben um tatsächliche Textdateien handelt. Dies bedeutet, dass jede Zeile mit einem Zeilenumbruch endet und die Dateien keine Nullbytes enthalten. Oh - und es stützt sich auch auf den Dateinamen selbst Newline frei zu sein (obwohl das vielleicht robust mit GNU behandelt werden tar
‚s - --xform
Option) . Wenn diese Bedingungen erfüllt sind, sollte eine beliebige Anzahl von Dateien in kürzester Zeit bearbeitet werden - und tar
dies ist fast alles.
Das Ergebnis ist eine Reihe von Zeilen, die wie folgt aussehen:
./fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
Und so weiter.
Ich habe es getestet, indem ich zuerst 5 Testdateien erstellt habe. Ich habe wirklich nicht das Gefühl , wie genning 10000 Dateien gerade jetzt, so dass ich nur ein wenig größer für jede ging - und auch dafür gesorgt , dass die Dateilängen von viel unterschieden. Dies ist beim Testen von tar
Skripten wichtig, da tar
Eingaben mit festen Längen blockiert werden. Wenn Sie nicht mindestens ein paar verschiedene Längen ausprobieren, wissen Sie nie, ob Sie tatsächlich nur die eine verarbeiten.
Wie auch immer, für die Testdateien, die ich gemacht habe:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
ls
danach berichtet:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
... dann rannte ich ...
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; }|
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' | cut -f-25
... um nur die ersten 25 durch Tabulatoren getrennten Felder pro Zeile anzuzeigen (da jede Datei eine einzelne Zeile ist - es gibt viele ) ...
Die Ausgabe war:
./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
Option mit dempaste
Befehl zu verwenden?