Có độ dài tối đa của danh sách đối số cho một quy trình mới trong hệ thống POSIX. find
sẽ phân chia thực thi nếu đường dẫn tệp dài hơn này. Để xem giới hạn trên Linux, hãy sử dụng xargs --show-limits
(không hoạt động trong Mac OS, nếu ai đó biết cách thay thế tốt hơn, vui lòng bình luận tại đây)
chỉnh sửa: bị đánh cắp trực tiếp từ câu trả lời của Gnouc, cách POSIX để có được độ dài tối đa của danh sách đối số là getconf ARG_MAX
. Tuy nhiên, tôi đã chạy thử nghiệm trên máy mac os của mình và có vẻ như find
sử dụng hơn một nửa số đó. Điều này phù hợp với thực tế là, trên hệ thống nơi nó hoạt động, xargs --show-limits
cho chúng ta biết rằng nó sẽ không sử dụng độ dài đối số tối đa (trong trường hợp này cũng sẽ sử dụng khoảng một nửa số đó), tuy nhiên tôi không thể tìm thấy lời giải thích cho điều đó
chỉnh sửa 2: có vẻ như cách đáng tin cậy duy nhất để xác định có bao nhiêu tham số find
sẽ dính vào nhau cho mỗi lần gọi là thử nghiệm, ví dụ như bằng cách chạy
find / -exec echo {} + | wc -cl
Vì đầu ra từ find
có một dòng cho mỗi lần echo
gọi, nên có thể đếm chúng bằng cách sử dụng wc -l
. Tổng số byte echo
ed là đầu ra wc -c
thay thế. Chia từng cái một, bạn sẽ có được số byte trung bình trong các tham số cho mỗi lần gọi lệnh (mặc dù giá trị thấp hơn một chút, vì làm tròn, khoảng một nửa chiều dài trung bình của một đường dẫn trong hệ thống của bạn)
find / -exec echo | wc
và đo tỷ lệ giữa số ký tự và số dòng tôi thấy rằng độ dài dòng lệnh tối đa được sử dụngfind
nhỏ hơn đáng kể so với giới hạn POSIX trên lý thuyết và gần hơn vớiSize of command buffer we are actually using
dòng trong đầu raxargs --show-limits
. Điều này đúng với Linux và nó có thể đúng với việc triển khai Mac OSfind
, mặc dùxargs
sẽ không in giá trị trong Mac OS. Bất cứ ý tưởng về lý do tại sao điều này xảy ra?