Làm cách nào tôi có thể tìm đệ quy tất cả các tệp trong thư mục hiện tại và thư mục con dựa trên kết hợp ký tự đại diện?


1888

Làm cách nào tôi có thể tìm đệ quy tất cả các tệp trong thư mục hiện tại và thư mục con dựa trên kết hợp ký tự đại diện?

Câu trả lời:


2742

Sử dụng tìm cho rằng:

find . -name "foo*"

findcần một điểm bắt đầu và .(dấu chấm) trỏ đến thư mục hiện tại.


21
Tôi biết điều này được gắn thẻ là linux nhưng điều này đáng được đề cập: đường dẫn được yêu cầu cho các biến thể * nix khác không phải là linux. Trên linux, đường dẫn là tùy chọn nếu bạn muốn sử dụng dấu chấm.
IslandCow

4
@Seatter "foo *" cho biết tìm kiếm tất cả các tệp bắt đầu bằng "foo". Nó chỉ là ví dụ của anh ấy. Bạn có thể sử dụng "gpio *" để tìm tất cả các tệp có tên bắt đầu bằng gpio hoặc chỉ "gpio1" để tìm tất cả các tệp có tên gpio1.
schumacher574

29
lưu ý rằng "foo *" nằm trong dấu ngoặc kép để shell không mở rộng nó trước khi chuyển nó đi tìm. nếu bạn vừa làm find . foo*, foo*nó sẽ được mở rộng VÀ thông qua để tìm.
grinch

33
Đáng nhấn mạnh đó " "là rất cần thiết cho tìm kiếm đệ quy.
WesternGun

3
Cũng hữu ích: Nếu bạn không muốn được thông báo về các thư mục mà bạn không có quyền (hoặc các lỗi khác), bạn có thể làmfind . -name "foo*" 2>/dev/null
Jobbo

221

Tìm đường ống vào grep thường thuận tiện hơn; nó cung cấp cho bạn toàn bộ sức mạnh của các biểu thức thông thường để khớp ký tự đại diện tùy ý.

Ví dụ: để tìm tất cả các tệp có chuỗi không phân biệt chữ hoa chữ thường "foo" trong tên tệp:

~$ find . -print | grep -i foo

57
findcũng có -iname, -regex-iregexcờ cho case-insensitive ký tự đại diện, regex, và case-insensitive khớp regex, vì vậy đường ống để greplà không cần thiết.
iobender

7
Tôi không nghĩ rằng nó là không cần thiết, nhưng thuận tiện hơn.
Elijah Lynn

1
Tuy nhiên, đường ống đến grep -v có thể cho phép bạn sử dụng các chuỗi hoặc biểu thức đơn giản để xóa các mục bạn không muốn.
door_number_three

3
@iobender - Đáng buồn thay, tôi có thể nói với bạn từ kinh nghiệm rằng không phải tất cả các hệ thống đều đi kèm với một findlệnh hỗ trợ các tùy chọn đó. Đôi khi greptrở thành lựa chọn duy nhất.
Ông Llama

150

find sẽ tìm thấy tất cả các tệp khớp với một mẫu:

find . -name "*foo"

Tuy nhiên, nếu bạn muốn có một hình ảnh:

tree -P "*foo"

Hi vọng điêu nay co ich!


18
brew install treedành cho người dùng Mac OSX apt-getđược cài đặt
DeBear 20/2/2015

1
Đã thử nghiệm trên macOS Sierra, chỉ cần thêm '--print' -> 'find. tên "* foo" - dấu '. superuser.com/questions/177289/searching-mac-ENC-terminal
john-salib

2
sudo yum cài đặt cây -y cho CentOS
Santosh Kumar Arjunan

39
find -L . -name "foo*"

Trong một vài trường hợp, tôi cần tham số -L để xử lý các liên kết thư mục tượng trưng. Theo mặc định liên kết tượng trưng được bỏ qua. Trong những trường hợp đó, điều này khá khó hiểu vì tôi sẽ thay đổi thư mục thành thư mục con và xem tệp phù hợp với mẫu nhưng find sẽ không trả về tên tệp. Sử dụng -L giải quyết vấn đề đó. Các tùy chọn liên kết tượng trưng để tìm là -P -L -H


1
L chuyển đổi là rất hữu ích. Nhiều lần người dùng không có bất kỳ ý tưởng nào về các thư mục cơ bản, cho dù chúng là liên kết mềm hay là các thư mục bình thường. Vì vậy, trong trường hợp nghi ngờ, luôn luôn tốt khi sử dụng tùy chọn L. Ít nhất, nó luôn giúp tôi.
Ritesh

2
Đó là câu trả lời cho tôi. Cảm ơn!
iedmrc

33

Nếu hệ vỏ của bạn hỗ trợ tùy chọn toàn cầu mới (có thể được bật bởi shopt -s globstar:), bạn có thể sử dụng:

echo **/*foo*

để tìm bất kỳ tập tin hoặc thư mục đệ quy. Điều này được hỗ trợ bởi Bash 4, zsh và các shell tương tự.


Cá nhân tôi đã xác định hàm shell này:

f() { find . -name "*$1*"; }

Lưu ý: Dòng trên có thể được dán trực tiếp vào shell hoặc thêm vào ~/.bashrctệp người dùng của bạn .

Sau đó tôi có thể tìm bất kỳ tập tin nào bằng cách gõ:

f some_name

Ngoài ra, bạn có thể sử dụng một fdtiện ích với một cú pháp đơn giản, ví dụ fd pattern.


1
Điều này chỉ đi vào một cấp độ duy nhất. Không đệ quy vào các thư mục con cho tôi
Broncha

3
@Broncha Bởi vì bạn cần kích hoạt toàn cầu mở rộng bằng shopt -s globstarlệnh. Điều này được hỗ trợ trong Bash, zsh và shell tương tự.
kenorb

bash-3.2$ shopt -s globstarchobash: shopt: globstar: invalid shell option name
thu hút

@drewish Bạn cần nâng cấp Bash của mình lên 4.x
kenorb

echo * / * foo nhanh hơn tìm kiếm
Josef Klimuk

32

fd

Trong trường hợp, findquá chậm, hãy thử fdtiện ích - một cách thay thế đơn giản và nhanh chóng để findviết bằng Rust.

Cú pháp:

fd PATTERN

Bản giới thiệu:

Trang chủ: https://github.com/sharkdp/fd


17
Lần đầu tiên tôi thấy một gif trên SO trong gần 9 năm. Công việc tốt!
Joshua Pinter

1
Những kết quả thực hiện có vẻ rất hứa hẹn. Bạn có thể cân nhắc thêm fd vào nhà pha chế ...
Gr3go

ngoài chủ đề: bạn đã sử dụng công cụ nào để tạo tập tin svg cho bản demo?
aprodan

2
@aprodan Hình ảnh demo được sao chép từ GitHub, nhưng tôi tin rằng họ đang sử dụng asciinema, sau đó được chuyển đổi sang định dạng GIF, nhưng tôi không chắc chắn.
kenorb

1
Trên thực tế, nó là định dạng SVG, vì vậy có lẽ asciicast2vectorcó thể được sử dụng.
kenorb

27
find <directory_path>  -type f -name "<wildcard-match>"

Trong kết hợp ký tự đại diện, bạn có thể cung cấp chuỗi bạn muốn khớp, ví dụ: * .c (cho tất cả các tệp c)


1
Câu trả lời của bạn là chính xác nhất đầu tiên ở đây vì nó chỉ tìm kiếm các tệp theo quy định. Những người khác không chỉ định loại sẽ trả về thư mục.
wilsotc

nếu bạn muốn tìm kiếm một thư mục "-type f" có thể được thay đổi thành "-type d"
XYZ_Linux

11

Bạn có thể dùng:

# find . -type f  -name 'text_for_search'

Nếu bạn muốn sử dụng REGX, hãy sử dụng -iname

# find . -type f  -iname 'text_for_search'

9

Lệnh sau sẽ liệt kê tất cả các tệp có tên "mẫu" chính xác (ví dụ) trong các thư mục hiện tại và thư mục con.

find ./ -name "pattern"


8

Cách mặc định để tìm kiếm tệp đệ quy và có sẵn trong hầu hết các trường hợp là

find . -name "filepattern"

Nó bắt đầu duyệt qua đệ quy cho tên tệp hoặc mẫu từ trong thư mục hiện tại nơi bạn được định vị. Với lệnh find, bạn có thể sử dụng ký tự đại diện và các công tắc khác nhau để xem danh sách đầy đủ các tùy chọn, nhập

man find

hoặc nếu trang man không có sẵn trong hệ thống của bạn

find --help

Tuy nhiên, sau đó, có nhiều công cụ hiện đại và nhanh hơn, tìm thấy toàn bộ hệ thống tệp của bạn và lập chỉ mục các tệp của bạn, một công cụ phổ biến như vậy là định vị hoặc định vị / mlocate, bạn nên kiểm tra hướng dẫn sử dụng HĐH của mình để biết cách cài đặt và đã cài đặt nó cần khởi tạo cơ sở dữ liệu, nếu tập lệnh cài đặt không làm điều đó cho bạn, nó có thể được thực hiện thủ công bằng cách nhập

sudo updatedb

Và, để sử dụng nó để tìm kiếm một số loại tệp cụ thể

locate filename

Hoặc, để tìm tên tệp hoặc patter từ trong thư mục hiện tại, bạn có thể nhập:

 pwd | xargs -n 1 -I {} locate "filepattern"

Nó sẽ xem qua cơ sở dữ liệu của các tệp và nhanh chóng in ra các tên đường dẫn khớp với mẫu mà bạn đã nhập. Để xem danh sách đầy đủ các tùy chọn định vị, nhập: locate --helphoặcman locate

Ngoài ra, bạn có thể định cấu hình định vị để cập nhật cơ sở dữ liệu vào thời gian đã lên lịch thông qua công việc định kỳ, vì vậy cron mẫu cập nhật db lúc 1AM sẽ như sau:

0 1 * * * updatedb

Các công việc cron này cần được cấu hình bởi root, vì updateb cần đặc quyền root để duyệt toàn bộ hệ thống tập tin.


7

để tìm kiếm tệp
find / -xdev -name settings.xml -> toàn bộ máy tính
find ./ -xdev -name settings.xml -> thư mục hiện tại và thư mục con của nó

cho các tệp có loại tiện ích mở rộng

find . -type f -name "*.iso"

6

Tôi ngạc nhiên khi thấy rằng định vị không được sử dụng nhiều khi chúng ta phải đi đệ quy.

Trước tiên tôi sẽ định vị "$ PWD" để lấy danh sách các tệp trong thư mục quan tâm hiện tại, sau đó chạy các greps trên chúng khi tôi muốn.

locate "$PWD" | grep -P <pattern>

Tất nhiên, điều này giả định rằng việc cập nhật được thực hiện và chỉ mục được cập nhật định kỳ. Đây là cách nhanh hơn để tìm tệp hơn là chạy tìm và yêu cầu nó đi xuống cây. Đề cập đến điều này cho đầy đủ. Không có gì chống lại việc sử dụng find, nếu cây không nặng lắm.


locate "$PWD*.mp4" Chỉ để nhắc nhở rằng bạn có thể bỏ quagrep
Hang Jefferey

5

Lệnh bên dưới giúp tìm kiếm mọi tệp

1) Không phân biệt trường hợp
2) Kết quả Loại trừ các thư mục mà không được phép
3) Tìm kiếm từ thư mục gốc hoặc từ đường dẫn bạn thích. Thay đổi / với đường dẫn bạn thích.

Cú pháp:
tìm -iname '' 2> & 1 | grep -v "Quyền bị từ chối"

Ví dụ

tìm / -iname 'C * .xml' 2> & 1 | grep -v "Quyền bị từ chối"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

1
Tại sao trên trái đất bạn sử dụng grep cho điều đó? Chỉ cần chuyển hướng stderr sang nullfind / -iname '*C*.xml' 2>/dev/null
phuclv 23/03/19

3

Nếu bạn muốn tìm kiếm tệp đặc biệt bằng ký tự đại diện, bạn có thể sử dụng mã sau:

find . -type f -name "*.conf"

Giả sử, bạn muốn tìm kiếm mọi tệp .cs từ đây:

.có nghĩa là tìm kiếm bắt đầu từ đây (vị trí hiện tại)
-typecó nghĩa là loại mục tìm kiếm mà ở đây là tệp (f).
-namecó nghĩa là bạn muốn tìm kiếm các tệp có tên * .conf .


3

Điều này sẽ tìm kiếm tất cả các tệp liên quan trong các thư mục hiện tại và phụ, tính toán số lượng dòng của chúng một cách riêng biệt cũng như hoàn toàn:

find . -name "*.wanted" | xargs wc -l

2

Sử dụng

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Giải trình

  1. Tham số đầu tiên là thư mục bạn muốn tìm kiếm.
  2. Theo mặc định findkhông đệ quy.
  3. Các -oviết tắt cho -or. Vì vậy, ở trên có nghĩa là tìm kiếm ký tự đại diện này HOẶC cái này. Nếu bạn chỉ có một mẫu thì không cần -o.
  4. Các trích dẫn xung quanh mẫu ký tự đại diện là bắt buộc.
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.