Sử dụng {html,php,htm}
chỉ có thể làm việc như một brace expansion, mà là một chuẩn (không phải POSIX-compliant) tính năng của bash
, ksh
, và zsh
.
Đối với một mở rộng nẹp để được công nhận, nó phải là một không thể viện chứng (một phần của) token trên dòng lệnh.
Một mở rộng cú đúp mở rộng để nhiều tranh cãi, vì vậy trong trường hợp trong tầm tay grep
kết thúc lên thấy nhiều--include=...
tùy chọn, cũng giống như khi bạn đã vượt qua chúng riêng rẽ.
Kết quả của sự mở rộng cú đúp là chịu globbing (mở rộng tên tập tin), trong đó có cạm bẫy:
Mỗi đối số kết quả hơn nữa có thể được mở rộng để phù hợp với tên tập tin nếu nó xảy ra để chứa unquoted globach siêu dữ liệu như *
.
Mặc dù điều này khó xảy ra với mã thông báo như --include=*.html
(ví dụ: bạn phải có tệp theo nghĩa đen có tên là giống như --include=foo.html
cho thứ gì đó phù hợp).
Nếu tùy chọn nullglob
vỏ xảy ra phải được bật (shopt -s nullglob
) và globbing trận gì, lập luận sẽ bỏ.
Do đó, đối với một giải pháp hoàn toàn mạnh mẽ, sử dụng như sau:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
được coi là một đen, do là đơn trích dẫn; điều này ngăn cản việc giải thích vô ý của *
như một nhân vật hình cầu.
{html,php,htm}
, các - cần thiết - không thể viện chứng cú đúp mở rộng [1] , mở rộng để lập luận, trong đó, do {...}
trực tiếp sau khi '...'
thẻ, bao gồm rằng Token.
Do đó, sau khi loại bỏ quote bằng vỏ, sau đen đối số cuối cùng được truyền cho grep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Chính xác hơn, đó là chỉ cú pháp có liên quan phần của việc mở rộng cú đúp mà phải không thể viện chứng, các yếu tố danh sách vẫn có thể được trích dẫn riêng và phải nếu chúng chứa globach siêu tốc mà có thể dẫn đến globbing không mong muốn sau khi mở rộng cú đúp; trong khi không cần thiết trong trường hợp này, các nội dung trên có thể được viết là
'--include=*.'{'html','php','htm'}
Tôi thấy sự cố. Tôi đã sử dụng --include = "*. {Html, php}" để ngăn trình bao mở rộng '*', đồng thời ngăn chặn trình bao mở rộng {html, php}. Có vẻ như dấu bằng trong --include = * có thể ngăn chặn trình bao mở rộng '*'. – tianyapiaozi
xargs không thực sự là một thay thế; rất nhiều lần khi bạn cần tính năng này, bạn đang xử lý nhiều tệp hơn xargs sẽ xử lý. –
@JamesMoore: Hãy xem [GNU Parallel] (https://www.gnu.org/software/parallel/). Nó thường có thể được sử dụng để thay thế cho 'xargs'. [This] (https://www.gnu.org/software/parallel/man.html#differences_between_xargs_and_gnu_parallel) cũng đáng đọc. HTH. – Steve