Tiền đề
Bạn không nên gặp phải lỗi đó chỉ với 15k tệp có định dạng tên cụ thể đó [ 1 , 2 ] .
Nếu bạn đang chạy bản mở rộng đó từ một thư mục khác và bạn phải thêm đường dẫn vào mỗi tệp, kích thước của lệnh của bạn sẽ lớn hơn và tất nhiên điều đó có thể xảy ra.
Giải pháp chạy lệnh từ thư mục đó.
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
Giải pháp tốt nhất Nếu thay vào đó tôi đoán là xấu và bạn chạy nó từ thư mục chứa các tệp ...
IMHO giải pháp tốt nhất là của Stéphane Chazelas :
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
với printf hoặc seq; đã thử nghiệm trên các tệp 15k chỉ có số của chúng trong bộ nhớ đệm trước, nó thậm chí còn nhanh hơn (hiện tại và ngoại trừ tệp OP từ cùng thư mục chứa các tệp).
Một số từ nữa
Bạn sẽ có thể chuyển đến dòng lệnh shell của bạn lâu hơn.
Dòng lệnh của bạn dài 213914 ký tự và chứa 15003 từ
cat file_{1..15000}.pdb " > file_all.pdb" | wc
... thậm chí thêm 8 byte cho mỗi từ là 333 938 byte (0,3M) thấp hơn nhiều so với 2097142 (2.1M) được báo cáo bởi ARG_MAX
kernel 3.13.0 hoặc 2088 232 nhỏ hơn một chút được báo cáo là "Độ dài tối đa của lệnh chúng ta thực sự có thể sử dụng " bởixargs --show-limits
Cung cấp cho nó một cái nhìn trên hệ thống của bạn với đầu ra của
getconf ARG_MAX
xargs --show-limits
Giải pháp hướng dẫn lười biếng
Trong những trường hợp như thế này, tôi thích làm việc với các khối hơn vì thường đưa ra giải pháp hiệu quả về thời gian.
Logic (nếu có) là tôi quá lười để viết 1 ... 1000 1001..2000, v.v ...
Vì vậy, tôi yêu cầu một kịch bản làm điều đó cho tôi.
Chỉ sau khi tôi kiểm tra đầu ra là chính xác, tôi mới chuyển hướng nó sang một tập lệnh.
... Nhưng Lười là một trạng thái của tâm trí .
Vì tôi dị ứng với xargs
(tôi thực sự nên sử dụng xargs
ở đây) và tôi không muốn kiểm tra cách sử dụng nó, tôi đã hoàn thành đúng giờ để phát minh lại bánh xe như trong các ví dụ dưới đây (tl; dr).
Lưu ý rằng vì tên tệp được kiểm soát (không có dấu cách, dòng mới ...), bạn có thể dễ dàng đi với một cái gì đó giống như tập lệnh bên dưới.
tl; dr
Phiên bản 1: vượt qua dưới dạng tham số tùy chọn số tệp 1, cuối cùng, kích thước khối, tệp đầu ra
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
cat $(seq -f file_%.17g.pdb $CurrentStart $CurrentEnd) >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
cat $(seq -f file_%.17g.pdb $CurrentStart $EndN) >> $OutFile;
Phiên bản 2
Gọi bash cho việc mở rộng (chậm hơn một chút trong các thử nghiệm của tôi ~ 20%).
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
echo cat file_{$CurrentStart..$CurrentEnd}.pdb | /bin/bash >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
echo cat file_{$CurrentStart..$EndN}.pdb | /bin/bash >> $OutFile;
Tất nhiên, bạn có thể tiếp tục và loại bỏ hoàn toàn seq
[ 3 ] (từ coreutils) và làm việc trực tiếp với các biến trong bash, hoặc sử dụng python hoặc biên dịch chương trình ac để làm điều đó [ 4 ] ...