xargs --replace / -I cho các đối số duy nhất


10

Tôi đang cố gắng sử dụng xargs để chạy một lệnh cho mỗi đối số được cung cấp, nhưng thật không may, cờ --replace / -I dường như không hoạt động chính xác khi được kết hợp với -n. Có vẻ như {} sẽ mở rộng vào danh sách đầy đủ các đối số được đọc từ stdin, bất kể tùy chọn -n.

Thật không may, tất cả các ví dụ trên web dường như là dành cho các lệnh (mv, cp, rm) sẽ lấy nhiều đối số trong đó {} được mở rộng.

Ví dụ: khi chạy:

echo a b c d | xargs -n 1 -I {} echo derp {}

Đầu ra là:

derp a b c d

Nhưng tôi đã mong đợi:

derp a
derp b
derp c
derp d

Tuy nhiên, chạy nó mà không có -I {} mang lại kết quả như mong đợi:

echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d

Có cách nào để đạt được điều này với xargs không? Mục đích cuối cùng của tôi là sử dụng nó để chạy nhiều phiên ssh (parralel), như

echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'

Tôi đang chạy xargs (GNU findutils) 4.4.2trên RHEL 6.3.


2
Điều thú vị là nó hoạt động như bạn dự định với BSD xargs, nhưng không phải GNU xargs.
slhck

1
man xargstrên -I: Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.Vì vậy, nó hoạt động như thiết kế.
Daniel Beck

@ André, vì ý định của bạn là chạy taks song song, bạn đã xem qua GNU song song chưa? Nó làm công việc độc đáo. Tuyên bố miễn trừ trách nhiệm: Tôi gói nó cho Debian.
rbrito

GNU song song có vẻ như là một sự thay thế tốt, nhưng thật không may, tôi không thể cài đặt nó trên máy chủ lưu trữ cụ thể này.
André Fernandes

@ AndréFernandes Bạn có thể giải thích nếu lý do của bạn không được bảo vệ bởi oletange.blogspot.dk/2013/04/why-not-install-gnu-abul.html
Ole Tange

Câu trả lời:


5

Bạn có thể lặp lại với các dòng mới để đạt được kết quả mong đợi của bạn. Trong trường hợp của bạn với việc mở rộng máy chủ sẽ là:

$ echo -e server{1..4}"\n" | xargs -I{} echo derp {}
derp server1
derp server2
derp server3
derp server4

Ý tưởng dòng mới hoạt động xung quanh vấn đề (không phải với ví dụ chính xác của bạn): máy chủ echo {1..4} | tr '' '\ n' | xargs -I {} echo derp {} derp server1 derp server2 derp server3 derp server4
André Fernandes

Xin lỗi, đã kiểm tra nó với zsh... Đã sửa câu trả lời của tôi. echocần sự -elựa chọn
ahilsend 26/07/13

2

Bạn có thể sử dụng một đường ống phụ như thế này,

echo a b c d | xargs -n1 | xargs -I{} echo derp {}
derp a
derp b
derp c
derp d

Việc sử dụng trung gian các xargs 'echos' mỗi chữ cái 'abcd' riêng vì tùy chọn '-n1'. Điều này đặt mỗi chữ cái trên dòng riêng của nó như thế này,

echo a b c d | xargs -n1
a
b
c
d 

Điều quan trọng là phải hiểu khi sử dụng -I (thay thế chuỗi), xargs ngụ ý -L, thực thi lệnh tiện ích (trong trường hợp của bạn là echo) một lần trên mỗi dòng. Ngoài ra, bạn không thể sử dụng -n với -L vì chúng loại trừ lẫn nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.