Có một giới hạn tối đa về thời gian một danh sách đối số có thể dành cho các lệnh hệ thống - giới hạn này là dành riêng cho phân phối dựa trên giá trị MAX_ARG_PAGES
khi kernel được biên dịch và không thể thay đổi mà không biên dịch lại kernel.
Do cách xử lý toàn cầu hóa bởi trình bao, điều này sẽ ảnh hưởng đến hầu hết các lệnh hệ thống khi bạn sử dụng cùng một đối số ("* .jpg"). Vì toàn cầu được xử lý bởi shell trước, sau đó được gửi đến lệnh, nên lệnh:
cp -uf *.jpg /targetdir/
về cơ bản là giống với vỏ như thể bạn đã viết:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Nếu bạn đang xử lý nhiều jpeg, điều này có thể trở nên khó kiểm soát rất nhanh. Tùy thuộc vào quy ước đặt tên của bạn và số lượng tệp bạn thực sự phải xử lý, bạn có thể chạy lệnh cp trên một tập hợp con khác nhau của thư mục tại một thời điểm:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Điều này có thể hoạt động, nhưng chính xác hiệu quả của nó sẽ dựa trên mức độ bạn có thể chia danh sách tệp của mình thành các khối có thể kết nối thuận tiện.
Toàn cầu Tôi thích từ đó.
Một số lệnh, chẳng hạn như find và xargs , có thể xử lý danh sách tệp lớn mà không tạo danh sách đối số có kích thước lớn.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
Đối số -exec sẽ chạy phần còn lại của dòng lệnh một lần cho mỗi tệp được tìm thấy bằng cách tìm , thay thế {} bằng mỗi tên tệp được tìm thấy. Vì lệnh cp chỉ được chạy trên một tệp tại một thời điểm, giới hạn danh sách đối số không phải là vấn đề.
Điều này có thể chậm do phải xử lý từng tệp riêng lẻ. Sử dụng xargs có thể cung cấp một giải pháp hiệu quả hơn:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs có thể lấy danh sách tệp đầy đủ do find cung cấp và chia nó thành các danh sách đối số có kích thước có thể quản lý và chạy cp trên mỗi danh sách con đó.
Tất nhiên, cũng có khả năng chỉ biên dịch lại kernel của bạn, đặt giá trị lớn hơn cho MAX_ARG_PAGES
. Nhưng biên dịch lại kernel là công việc nhiều hơn tôi sẵn sàng giải thích trong câu trả lời này.