lệnh tìm tập tin bằng cách chỉ tìm kiếm một phần tên của họ?


32

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?


5
Bạn có muốn liệt kê các tập tin phù hợp chỉ trong thư mục hiện tại? trong thư mục nào tại hoặc bên dưới thư mục hiện tại? bất cứ nơi nào trên hệ thống?
Steeldo

Câu trả lời:


47

Tìm tập tin với batmọi nơi

Để tìm tất cả các tệp ở bất kỳ nơi nào /path/to/foldercó 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 sang find. Sau đó findsẽ không làm việc đúng. ( \*bat\*"*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 cdsử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.)

Mở rộng hoặc thu hẹp tìm kiếm của bạn, dựa trên tê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, bAtv.v ... được khớp, hãy sử dụng -inamekiểm tra thay vì -namekiể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ó batngay từ đầu hoặc cuối phần trước .chậ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'

-ohoặc toán tử.

Chỉ khớp các tệp

Để 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 findvớ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 -otoá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 -xtypethay vì -type. Miễn là bạn không chạy findvới -Lcờ, -xtypetrê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 fsẽ 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.

Lấy đầu ra chi tiết

findHà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.

findthườ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

Đọc thêm

Để biết thêm thông tin về findvà các cách khác để tìm tệp, hãy xem:


1
Câu trả lời tuyệt vời, đặc biệt là -xtypelời khuyên; có lẽ ls *bat*-maxdepth/ mindepthcũng đáng được đề cập.
mkuity0

2
@ mkuity0 Cảm ơn! OP chưa cung cấp làm rõ về vị trí của các tệp và liệu có cần đệ quy hay không. Khi câu trả lời của sự hỗn loạnls đã đượ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 ( lsfindvớ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!
Eliah Kagan

16

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


1
nhu cầuupdatetdb
Sergiy Kolodyazhnyy

4
@Serg Để tìm tệp mới (mới hơn lần trước updatedbđược chạy thủ công hoặc tự động chạy), sudo updatedbtrước tiên, cần phải được chạy.
Eliah Kagan

Lưu ý rằng điều này sẽ tìm kiếm toàn bộ hệ thống cho phù hợp với tên bat.
terdon

1
@terdon Tôi đã nêu điều này trong câu trả lời, đừng nghĩ rằng nó xứng đáng được bỏ phiếu khi tôi đã tuyên bố điều này.
Mark Kirby

1
Lưu ý rằng đây là RẤT NHIỀU so find /với locatecác tìm kiếm từ cơ sở dữ liệu, trong khi findliệt kê đệ quy /và sau đó khớp với biểu thức chính quy.
Timothy Gu

14

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 -namechuỗi phù hợp batvà là trường hợp nhạy cảm. ( -inamekhông phân biệt chữ hoa chữ thường)
Các -type ftìm kiếm chỉ cho các tệp.


xóa và phục hồi? ok +1: P;)
AB

6

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

1
Nếu tìm kiếm của bạn bắt đầu với thư mục gốc, bạn có thể muốn thêm sudo, vì lệnh này sẽ báo cáo 'Quyền bị từ chối' cho một số thư mục
Sergiy Kolodyazhnyy

4

Bạn muốn sử dụng findlệnh, với -inametùy chọn khớp với tên tệp không phân biệt chữ hoa chữ thường hoặc -nametù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 batvớ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


@EliahKagan cảm ơn, tôi đã thêm một số thông tin vào câu trả lời của mình.
AJefferiss

+1 Cảm ơn bạn đã chỉnh sửa. IMO, một điểm mạnh của câu trả lời này là nó tránh khuyến nghị sử dụng bừa bãi -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 .
Eliah Kagan

2

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.
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.