Nói rằng có các tệp có tên:
batman.c
debate.c
cricketbat.c
Lệnh nào và làm thế nào tôi nên sử dụng nó để liệt kê tất cả các tệp này bằng cách sử dụng thẻ tìm kiếm bat
?
Nói rằng có các tệp có tên:
batman.c
debate.c
cricketbat.c
Lệnh nào và làm thế nào tôi nên sử dụng nó để liệt kê tất cả các tệp này bằng cách sử dụng thẻ tìm kiếm bat
?
Câu trả lời:
bat
mọi nơiĐể tìm tất cả các tệp ở bất kỳ nơi nào /path/to/folder
có tên bat
, bạn có thể sử dụng:
find /path/to/folder -name '*bat*'
Tôi đã trích dẫn mẫu tìm kiếm *bat*
bởi vì, nếu các trích dẫn bị bỏ qua và các tệp khớp với *bat*
thư mục hiện tại, shell sẽ mở rộng *bat*
thành một danh sách của chúng và chuyển nó sang find
. Sau đó find
sẽ không làm việc đúng. ( \*bat\*
và "*bat*"
cũng làm việc.)
Để tìm kiếm trong thư mục bạn hiện đang ở (ví dụ: bạn đã chỉnh cd
sửa), hãy sử dụng .
, như thường lệ:
find . -name '*bat*'
Để tìm kiếm toàn bộ máy tính của bạn, sử dụng/
. Để tìm kiếm thư mục nhà của bạn, sử dụng ~
, hoặc tên đầy đủ của thư mục nhà của bạn. ( Shell mở rộng~
đến đường dẫn đầy đủ của thư mục nhà của bạn.)
Nếu bạn muốn tìm kiếm không phân biệt chữ hoa chữ thường, vì vậy các tệp có chứa BAT
, bAt
v.v ... được khớp, hãy sử dụng -iname
kiểm tra thay vì -name
kiểm tra:
find /path/to/folder -iname '*bat*'
Tôi đã nhận thấy tất cả các tập tin của bạn kết thúc bằng .c
. Nếu bạn chỉ muốn tìm các tệp như vậy, hãy sử dụng:
find /path/to/folder -name '*bat*.c'
Tôi nhận thấy tất cả tên tệp của bạn có bat
ngay từ đầu hoặc cuối phần trước .c
hậu tố. Nếu bạn muốn tránh các tệp phù hợp như embattled.c
, bạn có thể sử dụng:
find /path/to/folder -name '*bat.c' -o -name 'bat*.c'
-o
là hoặc toán tử.
Để chỉ tìm các tệp thông thường - và không phải các thư mục, liên kết tượng trưng và các nút thiết bị đặc biệt - bạn có thể sử dụng -type f
. Điều này thường được đề xuất và đôi khi khá phù hợp ... nhưng thường không phải là những gì bạn thực sự muốn , đặc biệt nếu bạn đang chạy find
với mục đích tự kiểm tra đầu ra. Nếu bạn có một liên kết tượng trưng phù hợp với tìm kiếm của bạn, bạn sẽ không muốn biết về nó chứ?
Nếu bạn muốn tìm cả tệp thông thường và liên kết tượng trưng, bạn có thể sử dụng:
find /path/to/folder -name '*bat*' \( -type f -o -type l \)
Điều đó sử dụng -o
toán tử và cả dấu ngoặc đơn để phân nhóm (phải được trích dẫn để shell không xử lý chúng một cách đặc biệt; nếu không, bạn sẽ gặp lỗi cú pháp).
Nhưng giả sử bạn chỉ muốn xem các liên kết tượng trưng mà cuối cùng trỏ đến một tệp thông thường (và không phải là liên kết tượng trưng đến thư mục, nút thiết bị, v.v.). Điều đó thực sự thậm chí còn đơn giản hơn: sử dụng -xtype
thay vì -type
. Miễn là bạn không chạy find
với -L
cờ, -xtype
trên một liên kết tượng trưng sẽ kiểm tra loại tệp mà liên kết trỏ đến.
find /path/to/folder -name '*bat*' -xtype f
Nếu bạn có một liên kết tượng trưng đến một liên kết tượng trưng khác đến một tệp, -xtype f
sẽ khớp với nó ngay cả khi mục tiêu trực tiếp của nó là một liên kết tượng trưng khác chứ không phải là một tệp thông thường. Điều này gần như luôn luôn là những gì bạn muốn.
Mọi người thường nghĩ rằng họ muốn -type f
, nhưng thực sự họ muốn -xtype f
.
find
Hành động mặc định của bạn nếu bạn không chỉ định một là -print
. Tất cả các lệnh được đưa ra ở trên là tương đương với chính chúng được xử lý -print
ở cuối.
find
thường được sử dụng để chạy các lệnh dựa trên các tệp được tìm thấy - thường là các lệnh thực hiện thay đổi. Nhưng cũng có những hành động khác mà mục đích của nó là hiển thị kết quả, bên cạnh đó -print
. Quan tâm đặc biệt là -ls
:
find /path/to/folder -name '*bat*' -ls
Điều này cung cấp thông tin chi tiết trên mỗi tệp, ở định dạng nhiều cột, tương tự (mặc dù không hoàn toàn giống với) những gì bạn sẽ thấy bằng cách chạy .ls file
Để biết thêm thông tin về find
và các cách khác để tìm tệp, hãy xem:
find
nhãn hiệu trang , truy cập trực tuyến hoặc bằng cách chạy man find
trong một thiết bị đầu cuối.find
, locate
và xargs
các tiện ích.-xtype
lời khuyên; có lẽ ls *bat*
và -maxdepth
/ mindepth
cũng đáng được đề cập.
ls
đã được đề cập , tôi tập trung vào trường hợp đệ quy find
ở đây. Tất nhiên, một câu trả lời chi tiết bao gồm danh sách tên tệp không có giá trị (hoặc ít hơn) phù hợp với một số mẫu ( ls
và find
với -maxdepth
) cũng sẽ hữu ích. Bạn có thể muốn gửi một câu trả lời như vậy!
Cách dễ nhất là chạy
locate bat
Bằng cách này, bạn có thể tìm kiếm trong toàn bộ máy tính để tìm các tệp có chứa "bat" trong tên tệp
Để làm mới danh sách các tệp trên PC của bạn chạy
updatedb
Chạy lệnh này khi gần đây bạn đã thêm các tệp mới vào tài khoản của mình
updatetdb
updatedb
được chạy thủ công hoặc tự động chạy), sudo updatedb
trước tiên, cần phải được chạy.
bat
.
find /
với locate
các tìm kiếm từ cơ sở dữ liệu, trong khi find
liệt kê đệ quy /
và sau đó khớp với biểu thức chính quy.
Mở terminal và thay đổi thư mục vào thư mục từ nơi bạn muốn bắt đầu tìm kiếm và sau đó chạy lệnh này:
find . -name "*bat*" -type f
Lệnh .
bắt đầu từ thư mục hiện tại.
Các -name
chuỗi phù hợp bat
và là trường hợp nhạy cảm. ( -iname
không phân biệt chữ hoa chữ thường)
Các -type f
tìm kiếm chỉ cho các tệp.
Nếu các tập tin trong thư mục hiện tại sử dụng:
$ ls *bat*
batgirl.c batman.c batwoman.c cricketbat.c
Hoặc (để có chúng theo từng dòng):
$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c
Nếu bạn muốn tìm kiếm hệ thống cho các tệp đó, hãy sử dụng:
$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
Bạn muốn sử dụng find
lệnh, với -iname
tùy chọn khớp với tên tệp không phân biệt chữ hoa chữ thường hoặc -name
tùy chọn khớp với tên tệp phân biệt chữ hoa chữ thường . Cả hai sẽ cho phép bạn sử dụng tên ký tự đại diện. Vì vậy, để tìm bất kỳ tên tệp nào chứa "bat" bạn sẽ sử dụng:
find / -iname '*bat*'
Hoặc là
find / -name '*bat*'
Nghĩa *
là "bất kỳ ký tự nào", vì vậy tìm kiếm đang tìm kiếm bat
với bất kỳ ký tự nào, kể cả không có, trước hoặc sau nó. Các /
tìm kiếm từ thư mục gốc theo cách đệ quy, bạn có thể sử dụng .
sẽ tìm kiếm đệ quy từ thư mục hiện tại hoặc đường dẫn tuyệt đối cho nơi bạn muốn tìm kiếm. Hãy xem cách tìm kiếm tệp bằng regex trong tập lệnh shell linux
-type f
, điều này không chỉ đơn giản là loại trừ các thư mục và thường không phải là những gì người dùng thực sự muốn .
Sử dụng tốt cũ find
.
find <path_for_search> -type f -iname "*bat*"
ví dụ.:
% find . -type f -iname "*bat*"
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c
từ man find
:
-type c
File is of type c:
[..]
d directory
[..]
f regular file
[..]
-iname pattern
Like -name, but the match is case insensitive.