2010-11-15 2 views
23

Gần đây tôi đã sao chép và di chuyển một số lượng lớn tệp (~ 400.000). Tôi biết rằng có những hạn chế về số lượng đối số có thể được mở rộng trên dòng lệnh Bash, vì vậy tôi đã sử dụng xargs để giới hạn số được tạo ra.Số đối số Bash tối đa! = Max đối số num cp?

Ra khỏi tò mò, tôi tự hỏi không biết số lượng tối đa của các đối số mà tôi có thể sử dụng được, và tôi thấy this post nói rằng đó là hệ thống phụ thuộc, và rằng tôi có thể chạy lệnh này để tìm hiểu:

$ getconf ARG_MAX 

Trước sự ngạc nhiên của tôi, anwser tôi trở là:

2621440 

Chỉ hơn 2.600.000. Như tôi đã nói, số lượng tệp mà tôi đang thao tác ít hơn nhiều so với khoảng 400k. Tôi chắc chắn cần sử dụng phương pháp di chuyển và sao chép các tệp này theo phương pháp xargs, vì tôi đã thử sử dụng một số thông thường mv * ... hoặc cp * ... và nhận được lỗi 'Danh sách đối số quá dài'.

Vì vậy, hãy thực hiện các lệnh mvcp có giới hạn cố định riêng về số lượng đối số mà tôi có thể sử dụng (tôi không thể tìm thấy bất kỳ điều gì trong trang người đàn ông của họ).

+0

Tại sao bạn phải chỉ định từng tệp? Bạn không thể chỉ định thư mục họ đang ở hoặc một cái gì đó như thế? –

+0

@Christoffer Tôi không chỉ sao chép một thư mục từ nơi này sang nơi khác, tôi đang sao chép các tệp cụ thể, đổi tên các nhóm tệp, di chuyển các tệp nhất định từ địa điểm này sang nơi khác. Tôi không có vấn đề trong thực tế thực hiện các hoạt động này. Tôi chỉ tò mò về những hạn chế cụ thể của lệnh 'cp' và' mv'. –

Trả lời

23

Như Ignacio nói, ARG_MAX là chiều dài tối đa của đệm các đối số truyền cho exec(), không phải là số lượng tối đa của file (this page có rất sâu giải thích). Cụ thể, nó sẽ liệt kê fs/exec.c như kiểm tra các điều kiện sau đây:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *)/sizeof(void *) 

Và, có vẻ như, bạn có một số hạn chế bổ sung:

Trên 32-bit Linux, đây là ARGMAX/4-1 (32767). Điều này trở nên có liên quan nếu độ dài trung bình của đối số nhỏ hơn 4. Kể từ Linux 2.6.23, hàm này sẽ kiểm tra nếu số vượt quá MAX_ARG_STRINGS trong <linux/binfmts.h> (2^32-1 = 4294967296-1). Và với tư cách là giới hạn bổ sung, một đối số không được dài hơn MAX_ARG_STRLEN (131072).

6

ARG_MAX là độ dài tối đa của đối số cho các hàm exec(3). Một trình bao không cần thiết để hỗ trợ truyền độ dài của các đối số này từ dòng lệnh của nó.

+0

Nhưng bash không thực thi giới hạn _any_, nói [this] (http://www.in-ulm.de/~mascheck/various/argmax/); nó chỉ cố gắng 'exec' và vượt qua một lỗi hệ điều hành nếu danh sách đối số quá dài. – alexis