2012-10-05 35 views
5

tôi đã được sử dụng zsh globbing cho các lệnh như:tại sao zsh globbing không hoạt động với lệnh find?

vim **/filename 
vim *.html.erb 

và như vậy, nhưng khi tôi gõ vào một cái gì đó như:

find . -name *mobile* 

tôi nhận được câu trả lời:

zsh: no matches found: *mobile* 

Tại sao?

+0

Tôi nghĩ rằng nó có câu trả lời tốt hơn ở đây: https://unix.stackexchange.com/questions/130958/scp-wildcard-not-working-in-zsh – sttaq

Trả lời

29
find . -name *mobile* # does not work 

vs

find . -name '*mobile*' # works 

Sự khác biệt là do các bước mà vỏ mất khi nó phân tích một dòng. Thông thường, shell mở rộng bất kỳ ký tự đại diện nào mà nó tìm thấy trước khi nó chạy lệnh. Tuy nhiên, dấu nháy đơn đánh dấu đối số là một chữ, có nghĩa là trình bao không mở rộng ký tự đại diện mở rộng trên đối số đó trước khi chạy lệnh.

Để chứng minh sự khác biệt, giả sử bạn đang ở trong một thư mục với các file sau:

$ tree 
./ 
mobile.1 
dir/ 
    mobile.2 

zsh sẽ mở rộng các hình thức đầu tiên sau trước khi chạy nó:

find . -name mobile.1 

Có nghĩa là tìm kiếm sẽ chỉ tìm các tệp có tên là mobile mobile

Biểu mẫu thứ hai sẽ được chạy như sau:

find . -name *mobile* 

Điều đó có nghĩa là tìm sẽ tìm kiếm bất kỳ tên tệp nào chứa chuỗi "di động".

Điều quan trọng cần lưu ý ở đây là cả zsh và tìm hỗ trợ cùng một cú pháp ký tự đại diện, nhưng bạn muốn tìm cách xử lý các ký tự đại diện trong trường hợp này, chứ không phải zsh.

1

Hóa ra rằng tất cả các bạn phải làm gì để giải quyết vấn đề là thêm một số dấu ngoặc kép quanh đầu vào:

find . -name '*mobile*' 

tôi không thực sự có một câu trả lời là tại sao chỉ được nêu ra ... và các tài liệu không có cái gì đó dính vào tôi, nhưng hãy cho tôi biết nếu bạn biết câu trả lời!

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