2012-02-28 10 views
8

Tôi có một số tệp chứa một chuỗi cụ thể. Những gì tôi muốn làm là, tìm kiếm một vị trí cho tập tin; nếu tệp tồn tại grep cho mẫu; nếu đúng, hãy làm gì đó.xargs - nếu điều kiện và tiếng vang {}

find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi 

Những vấn đề là:

  • xargs không được làm việc với các câu lệnh if.
  • echo {} không cung cấp tên tệp, thay vào đó hãy cung cấp {}.

Làm cách nào để khắc phục những điều này?

+0

Tại sao không có 'chạy find'' grep' bản thân? –

+0

làm điều gì đó trên tệp hoặc dòng được grepped? –

Trả lời

18

Cố gắng chạy lệnh thông qua một vỏ như thế này:

$ find -iname file.xxx | 
> xargs -I {} bash -c 'if grep -Fq "string" {} ; then echo {} ; fi' 

nơi lệnh ban đầu đã được bao quanh bởi dấu ngoặc kép và bash -c.

5

Bó if-tuyên bố trong một cuộc gọi đến sh:

find -iname file.xxx | xargs -I {} sh -c 'grep -Fq "string" {} && { echo {}; }' 

Sử dụng một thời gian vòng lặp thay vì xargs

find -iname file.xxx | while read -r file; do 
    if grep -Fq "$file"; then 
    # do something 
    echo "$file" 
    fi 
done 

Tôi giả sử bạn muốn làm nhiều hơn là tiếng vang tên tập tin. Nếu đó là tất cả các bạn đang cố gắng để làm, sử dụng tùy chọn -l grep của:

find -iname file.xxx | xargs grep -Fl "string" 
0

Thứ nhất, if là một bash-lệnh và không có chương trình thực thi. Mặt khác, xargs cần một chương trình riêng biệt.

Thứ hai, các ký tự ; có thể phân tách lệnh của bạn. Bạn sẽ phải trốn thoát họ để có được họ xargs.

Để tránh tất cả điều này, tôi đề nghị như sau:

for i in `find -iname file.xxx` ; do grep -Fq "string" $i && echo $i ; done 
+2

Nói chung, việc sử dụng vòng lặp for-loop không được khuyến nghị do cách nó tách từ đầu ra của tìm - tên tập tin bằng dấu cách sẽ bị chia nhỏ. Tốt hơn nên sử dụng vòng lặp while để đọc các tên tệp. –

+0

Điểm tốt. Luôn luôn cẩn thận về không gian! – Quota

-1
find -iname file.xxx | while read FILE; do 
if grep -Fq "string" $FILE ; then echo $FILE ; 
done 
+0

Câu trả lời này được gắn cờ là chất lượng thấp vì độ dài và nội dung của nó. Đề nghị thêm một mô tả về những gì nó làm và cách nó trả lời câu hỏi. –