xargs
mong đợi một định dạng đầu vào rất đặc biệt trong đó các đối số được phân cách bằng khoảng trắng hoặc dòng mới (đôi khi là các dạng khác của khoảng trắng dọc, đôi khi phụ thuộc vào miền địa phương hiện tại) và trong đó có thể sử dụng dấu ngoặc đơn, dấu ngoặc kép và dấu gạch chéo ngược để thoát chúng (nhưng khác cách từ trích dẫn vỏ).
-l1
không phải là truyền một dòng đầu vào dưới dạng một đối số duy nhất mkdir
, nhưng để gọi một mkdir
lời gọi cho mỗi dòng đầu vào nhưng với các từ trên dòng đó vẫn được phân tách thành các đối số khác nhau mkdir
.
Việc triển khai GNU xargs
đã thêm một -0
tùy chọn từ nhiều thập kỷ trước để chấp nhận đầu vào được phân định bằng NUL. Đó là cách rõ ràng nhất để phân tách các từ sắp kết thúc thành đối số cho một lệnh vì ký tự NUL tình cờ là ký tự duy nhất không thể xảy ra trong một đối số lệnh hoặc tên tệp (định dạng danh sách được chọn của bạn đặt một tệp trên mỗi dòng không thể đại diện cho tất cả các tên tệp có thể vì nó không cho phép một dòng mới trong một tên tệp).
Điều đó -0
đã được sao chép bởi một số xargs
triển khai khác nhưng không phải tất cả.
Với những người bạn có thể làm:
<file tr '\n' '\0' | xargs -0 mkdir -p --
Điều đó sẽ gọi mkdir
càng ít lần càng tốt với càng nhiều đối số càng tốt.
Nhưng lưu ý rằng nếu file
trống, mkdir
vẫn sẽ được chạy và bạn sẽ gặp lỗi cú pháp mkdir
do thiếu đối số. GNU xargs
đã thêm một -r
tùy chọn cho cái đã được sao chép bởi một vài triển khai khác.
GNU xargs
cũng đã thêm (sau này) một -d
tùy chọn để có thể chỉ định các dấu phân cách tùy ý, nhưng tôi không nghĩ rằng bất kỳ triển khai nào khác đã sao chép nó. Với GNU xargs
, cách tốt nhất là với:
xargs -rd '\n' -a file mkdir -p --
Bằng cách chuyển tệp với -a
(cũng là phần mở rộng GNU) thay vì stdin, điều đó có nghĩa mkdir
là stdin của được giữ nguyên.
POSIXly, bạn cần xử lý hậu kỳ đầu vào để đặt nó ở định dạng mong đợi xargs
. Bạn có thể làm điều đó với:
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' | xargs mkdir -p --
Nơi chúng tôi đặt mỗi dòng bên trong dấu ngoặc kép và thoát từng dòng "
như "\""
trước khi cho xargs.
Nhưng hãy cẩn thận với những hạn chế có thể:
- lỗi khi tập tin trống đã được đề cập ở trên
- nó có thể thất bại với một số triển khai (bao gồm cả
sed
) nếu nội dung của file
văn bản không hợp lệ trong ngôn ngữ hiện tại. Nếu file
chứa mã hóa tên tệp trong nhiều bộ ký tự khác nhau hoặc bộ ký tự khác với bảng địa phương, bạn có thể sửa miền địa phương thành C sẽ giúp ích.
- một số
xargs
triển khai có giới hạn thấp một cách lố bịch về độ dài tối đa của một đối số (có thể thấp tới 255 byte).
Để khắc phục lỗi cú pháp khi lỗi đầu vào trống , bạn có thể viết:
<file sed 's/"/"\\""/g; s/^/"/; s/$/"/' |
xargs sh -c '[ "$#" -eq 0 ] || exec mkdir -p -- "$@"' sh
-d
tùy chọn.