2010-04-26 37 views

Trả lời

139

Có lẽ đơn giản nhất để sử dụng xargs. Trong trường hợp của bạn:

ls -1 | xargs -L1 echo 
+15

'ls' tự động thực hiện' -1' trong một đường ống. –

+5

@ Dennis, không giống như: 'ls | xargs -L2 echo' và 'ls -1 | xargs -L2 echo' cho hai đầu ra khác nhau. Trước đây là tất cả trên một dòng. –

+1

@ Alex: Tôi nhận được cùng một đầu ra. –

8

Bạn có thể sử dụng một for loop:

 
for file in * ; do 
    echo "$file" 
done 

Lưu ý rằng nếu lệnh trong câu hỏi chấp nhận nhiều đối số, sau đó sử dụng xargs là hầu như luôn luôn hiệu quả hơn vì nó chỉ có để đẻ trứng tiện ích trong câu hỏi một lần thay vì nhiều lần.

+1

Điều đáng mô tả việc sử dụng xargs đúng cách/an toàn, tức là. 'printf '% s \ 0' * | xargs -0 ... '- ngược lại, nó không an toàn với tên tập tin có khoảng trống, dấu ngoặc kép, v.v. –

98

Bạn có thể sử dụng một hoạt động thêm vào trước cơ bản trên mỗi dòng:

ls -1 | while read line ; do echo $line ; done 

Hoặc bạn có thể đường ống đầu ra để sed cho các hoạt động phức tạp hơn:

ls -1 | sed 's/^\(.*\)$/echo \1/' 
+0

Lệnh sed dường như không hoạt động:' sh: cho: không tìm thấy sh: cho: không tìm thấy ' giống như nó lấy 'e' trong echo là lệnh sed hay gì đó. –

+0

+1 cho vòng lặp 'while'. 'cmd1 | trong khi đọc dòng; làm cmd2 $ line; done'. Hoặc 'trong khi đọc dòng; làm cmd2 $ line; thực hiện <<(cmd1) 'mà không tạo ra một subshell. Đây là phiên bản đơn giản của lệnh 'sed' của bạn:' sed 's /.*/ echo & /' ' –

+1

@Alex: thay đổi dấu ngoặc kép thành dấu nháy đơn. –

2
for s in `cmd`; do echo $s; done 

Nếu cmd có một sản lượng lớn:

cmd | xargs -L1 echo 
+6

nếu 'cmd' có dấu cách trong đầu ra của nó, giá trị đầu tiên sẽ thất bại. –

+0

http://mywiki.wooledge.org/DontReadLinesWithFor, http://mywiki.wooledge.org/BashPitfalls mụC# 1 –

6

Bạn thực sự có thể sử dụng sed để làm điều đó, với điều kiện nó được GNU sed.

... | sed 's/match/command \0/e' 

Cách hoạt động:

  1. thay thế phù hợp với lệnh trận đấu
  2. On thay thực hiện lệnh
  3. Thay thế dòng thay thế bằng sản lượng lệnh.
+0

Tuyệt vời. Tôi đã quên đặt lệnh ** e ** ở cuối, nhưng sau khi nhìn thấy câu trả lời của bạn và nó đã hoạt động. Tôi đã cố gắng để thêm một ID ngẫu nhiên giữa 1000 và 15000, khi SED phù hợp với một dòng. 'cat /logs/lfa/Modified.trace.log.20150904.pw | sed -r 's/^ (. *) (\ | 006 \ | 00032 \ |) (. *) $/echo "\ 1 \ 2 \ 3 - ID \' shuf -i 999-14999 -n 1 \ ' "/ e '' – sgsi

0

kết quả tốt hơn cho tôi:

ls -1 | xargs -L1 -d "\n" CMD 
+0

Tốt hơn, nhưng không hoàn hảo. 'tìm. -mindepth 1 -maxdepth 1 -print0 | lệnh xargs -0' sẽ xử lý các trường hợp đầu ra của 'ls -1' không rõ ràng; sử dụng '-printf '% P \ 0'' thay vì' -print0' nếu bạn không muốn có '. /' hàng đầu trên mỗi cái. –

0

xargs không thành công với với gạch chéo ngược, dấu ngoặc kép. Nó cần phải được cái gì đó như

ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file." 

xargs -0 tùy chọn:

-0, --null 
      Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are 
      not special (every character is taken literally). Disables the end of file string, which is treated like 
      any other argument. Useful when input items might contain white space, quote marks, or backslashes. The 
      GNU find -print0 option produces input suitable for this mode. 

ls -1 chấm dứt mục có ký tự xuống dòng, vì vậy tr dịch chúng thành các ký tự null.

Phương pháp này chậm hơn khoảng 50 lần so với lặp lại thủ công với for ... (xem Michael Aaron Safyan câu trả lời) (3,55 giây so với 0,066 giây). Nhưng đối với các lệnh nhập khác như định vị, tìm, đọc từ một tệp (tr \\n \\0 <file) hoặc tương tự, bạn phải làm việc với xargs như thế này.

Các vấn đề liên quan