Tại sao lệnh bash này chiếm hết dung lượng trên thiết bị?


6

Tôi là một người mới trong việc tìm kiếm thông qua bash, vì vậy hãy cho tôi đề xuất về các phương pháp sử dụng thay vì phương pháp này, điều mà tôi sẽ không bao giờ sử dụng nữa.

Tôi đang tìm kiếm sự xuất hiện của một chuỗi, đệ quy trong một thư mục , với ~ 50 tệp php không lớn trong đó; một số trong thư mục hiện tại, một số trong các thư mục bên dưới thư mục hiện tại, nhiều nhất là ba cấp độ thư mục.

Phương pháp tôi đang sử dụng là

find . | xargs grep "module" > module.txt

Khi trong các thư mục đơn giản (một cấp), điều này hoạt động tốt, nhưng trong trường hợp này, tệp đã trở thành dung lượng lớn 4 GB cho đến khi nó lấp đầy tất cả không gian trên phân vùng . Nó thậm chí còn chưa được thực hiện.

Tại sao tập tin đó phát triển quá lớn?


8
Để hiểu đệ quy là hiểu đệ quy
Tim Post

7
Tại sao lại đóng? Đó thực chất là một trường hợp đệ quy ngoài ý muốn. Là một khái niệm, nó chắc chắn có liên quan đến lập trình.

Tương tác Shell dường như là một vấn đề khó khăn cho việc lựa chọn trang web. Một mặt là các chương trình bạn sử dụng , mặt khác chúng là các ngôn ngữ hoàn chỉnh Turing trong đó một chương trình viết các chương trình . Vì vậy, lựa chọn trang web phụ thuộc vào một cuộc gọi phán xét về việc bạn có "lập trình" hay không. Đây là một lớp lót mà tôi đã giới thiệu trên Super User ngay từ đầu, nhưng nó đủ vấn đề của một lập trình viên mà tôi sẽ không bỏ phiếu để di chuyển nó.
dmckee

Câu trả lời:


20

module.txtđược tạo trước khi đường ống bắt đầu, do đó nó được đưa vào tìm kiếm. greptìm thấy một thể hiện của "mô-đun" trong đó, vì vậy một dòng được thêm vào nó chứa từ "mô-đun". Mà grep sau đó tìm thấy, và thêm. Mà grep sau đó tìm thấy, và thêm. Mà grep sau đó tìm thấy, và thêm. Mà ...


Bẩn thỉu. Ok, đó là vấn đề, bạn có thể chỉ cho tôi một giải pháp? Tức là với một cú pháp khác hoặc chỉ một cái gì đó để thêm vào tìm kiếm này?
chelmertz

2
@OP: Giải pháp là đảm bảo tên tệp kết quả của bạn không chứa từ khóa tìm kiếm.
dùng22644

6
Lưu trữ các tập tin bên ngoài các tham số tìm kiếm.
Ignacio Vazquez-Abrams

@coddadict: tất nhiên, +1. Điều này sẽ nhanh hơn hoặc chậm hơn những gì @MBO đề xuất?
chelmertz

@OP: Tôi đoán sử dụng tùy chọn đệ quy với grep (như được đề xuất bởi MBO) có thể nhanh hơn giải pháp này, vì một quy trình duy nhất sẽ được tham gia và sẽ không có IPC. Những người khác xin vui lòng gửi ý kiến ​​của bạn.
dùng22644

1

Và đầu ra là gì mà không có > module.txt.

Tại sao không thử sử dụng grep -R "module" . > ../module.txt?


1
find /path -type f -iname "*.php" | while read -r FILE
do
  grep -H "module" "$FILE" >> "file_with_search_term_found.txt"
done

Hoặc nếu grep của bạn có chức năng đệ quy,

grep -RH "module" *.php

Hoặc với bash 4.0 shell

shopt -s globstar
for file in /path/**/*.php
do
   if [ -f "$file" ];then
      while read -r line 
      do
         case "$line" in
           *module* ) echo $line >> module.txt;;
         esac    
      done <"file"      
   fi

done

Hoặc find -name '*.php' -exec grep -q -H "module" {} \; -print > ../module.txt.
Ignacio Vazquez-Abrams

tôi thíchfind /path -type f -iname "*.php" -exec grep -q -H "module" "{}" +; ...
user31894
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.