Làm thế nào để tìm thấy. -name * foo * `làm việc?


8

Tôi nghĩ rằng ký tự đại diện *trong lệnh find . -name *foo*được thay thế bằng bash, và lệnh này hoạt động trừ khi *foo*khớp với thứ gì đó trong thư mục hiện tại, thì không. Thật khó hiểu.


3
Lưu ý: Nếu bạn thay thế find . -name *foo*bằng find . -name '*foo*'nó sẽ cho phép các ký tự đại diện hoạt động như mong đợi.
Hóa đơn

Câu trả lời:


14

Nếu bash không thể tìm thấy kết quả khớp, nó sẽ chuyển chuỗi ký tự đến ứng dụng *chưa được mở rộng. Ví dụ:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bashmở rộng *foo*vì nó khớp, nhưng được truyền *bar*trực tiếp vì không được. Thay vào đó, nullglobtùy chọn sẽ báo bash để giải quyết các mẫu không khớp với chuỗi trống thay thế:

$ shopt -s nullglob
$ /tmp/test *bar*

$

1
Một nhận xét nhỏ để nói rằng zsh không có hành vi mặc định tương tự, nó trả về một lỗi : zsh: no matches found.
Stéphane Gimenez

zsh no_nomatchphải kích hoạt hành vi này.
chx

5

Nếu bạn muốn findcó được chuỗi chưa được mở rộng, thì bạn có thể trích dẫn nó hoặc bảo vệ các ký tự đại diện bằng dấu gạch chéo ngược.

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test '*foo*'
*foo*

$ /tmp/test \*foo\*
*foo*
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.