Tìm lệnh: làm thế nào để bỏ qua trường hợp?


170

Tôi đang tìm tập tin "WSFY321.c" trong một hệ thống phân cấp thư mục lớn.
Thông thường tôi sẽ sử dụng GNU find : find . -name "WSFY321.c"
Nhưng tôi không biết trường hợp này, nó có thể là chữ hoa, chữ thường hoặc kết hợp cả hai.

Cách dễ nhất để tìm tập tin này là gì?
Có điều gì tốt hơn find . | grep -i "WSFY321.c"?

Câu trả lời:


214

Các phiên bản gần đây của GNU find-inamecờ, cho các tìm kiếm tên không phân biệt chữ hoa chữ thường.

find . -iname "WSFY321.c"

6
Ngoài ra, vì bạn đang tìm kiếm một tập tin cụ thể, bạn có thể loại bỏ một vài dấu tick khác bằng -type fcờ để nó không bận tâm đến việc tìm tên nếu inode là một thư mục. Nhưng đó là mức độ tối ưu hóa
khổng lồ

Để làm việc với một số regex bạn có thể làmfind . -iname \*WSFY321.c\* -type f
Ngày

40

Với GNU find hoặc các phiên bản tìm kiếm khác có nó:

find . -iname 'WSFY321.c'

Với các phiên bản khác:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

Hoặc một thỏa hiệp chậm hơn nhưng dễ gõ hơn:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

Hoặc trong zsh:

print -rl -- **/(#i)WSFY321.c

@Gilles Các grepphiên bản là lọc chỉ chữ hoa, và tôi không hiểu được '[^ /]' .. (không /)
Peter.O

@Gilles Đối số để sử dụng dấu ngoặc đơn trong trường hợp đầu tiên (tên tệp chính xác) không có dấu ngoặc kép là gì?
Bernhard

@ Peter.O Không *sau /phiên bản bash. Tôi có nghĩa grep -i. Tôi sử dụng [^/]*chứ .*không phải để không bắt các tập tin trong các thư mục có tên bắt đầu WSFY.
Gilles

5
@ Tính nhất quán.
Gilles

Cảm ơn Gilles: Tôi đã xóa nhận xét trước đó với cú pháp không chính xác và đã kiểm tra phiên bản được trang bị, nhưng nó không hoạt động mà không có * (vì một lý do không mong muốn; ít nhất là với tôi). Các tùy chọn case-insensitive không còn hoạt động: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Tôi cho rằng đó là lý do tại sao nó được gọi là một nocase glob : nó chỉ hoạt động trong bối cảnh của một glob (hoặc lâu hơn có vẻ như).
Peter.O

1

Hai giải pháp cho macOS:

Sử dụng GNU find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

Sử dụng GNU sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"

1
Trên macOS Sierra, tùy chọn -iname có sẵn theo mặc định.
ThomasW
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.