i=0
{ paste res.? res.?? res.???
while paste ./res."$((i+=1))"[0-9][0-9][0-9]
do :; done; } >outfile
Tôi không nghĩ rằng điều này phức tạp như tất cả những điều đó - bạn đã hoàn thành công việc khó khăn bằng cách đặt tên tập tin. Chỉ cần không mở tất cả chúng cùng một lúc, là tất cả.
Cách khác:
pst() if shift "$1"
then paste "$@"
fi
set ./res.*
while [ -n "${1024}" ] ||
! paste "$@"
do pst "$(($#-1023))" "$@"
shift 1024
done >outfile
... nhưng tôi nghĩ rằng chúng làm ngược lại ... Điều này có thể hoạt động tốt hơn:
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
Và đây là một cách khác :
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' >outfile
Điều đó cho phép tar
tập hợp tất cả các tệp thành một luồng được phân tách bằng null cho bạn, phân tích tất cả siêu dữ liệu tiêu đề của nó trừ tên tệp và chuyển đổi tất cả các dòng trong tất cả các tệp thành các tab. Mặc dù vậy, nó phụ thuộc vào đầu vào là các tệp văn bản thực tế - có nghĩa là mỗi đầu kết thúc với một dòng mới và không có byte rỗng trong các tệp. Ồ - và nó cũng dựa vào tên tập tin không có dòng mới (mặc dù điều đó có thể được xử lý mạnh mẽ với tùy chọn tar
của GNU --xform
) . Với những điều kiện này được đáp ứng, nó sẽ làm cho công việc rất ngắn của bất kỳ số lượng tệp nào - và tar
sẽ thực hiện hầu hết tất cả.
Kết quả là một tập hợp các dòng trông như:
./fname1
C1\tC2\tC3...
./fname2
C1\tC2\t...
Và như thế.
Tôi đã thử nghiệm nó bằng cách tạo 5 testfiles đầu tiên. Tôi thực sự không cảm thấy giống như việc tạo ra 10000 tệp, vì vậy tôi chỉ lớn hơn một chút cho mỗi tệp - và cũng đảm bảo rằng độ dài của tệp khác nhau rất nhiều. Điều này rất quan trọng khi kiểm tra tar
tập lệnh vì tar
sẽ chặn đầu vào theo độ dài cố định - nếu bạn không thử ít nhất một vài độ dài khác nhau, bạn sẽ không bao giờ biết liệu bạn có thực sự chỉ xử lý một độ dài hay không.
Dù sao, đối với các tập tin thử nghiệm tôi đã làm:
for f in 1 2 3 4 5; do : >./"$f"
seq "${f}000" | tee -a [12345] >>"$f"
done
ls
sau đó báo cáo:
ls -sh [12345]
68K 1 68K 2 56K 3 44K 4 24K 5
... sau đó tôi chạy ...
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; }|
cut -d '' -f-2,13 |
tr '\0\n' '\n\t' | cut -f-25
... Chỉ hiển thị 25 trường được phân tách bằng tab đầu tiên trên mỗi dòng (vì mỗi tệp là một dòng - có rất nhiều ) ...
Đầu ra là:
./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
tùy chọn vớipaste
lệnh?