Làm thế nào để tìm một tập tin từ bất kỳ thư mục


22

Tôi đang cố gắng tìm kiếm một tệp có tên Book1 .

Trong thử nghiệm của tôi, tôi đang cố gắng tìm kiếm tệp đã nói ở trên và trong thử nghiệm này, tôi không biết tệp đó nằm ở đâu.

Tôi đã thử find / -iname book1nhưng không có đầu ra.

Làm cách nào để tìm tệp của tôi được gọi là book1 bằng dòng lệnh nếu tôi không biết tệp nằm ở đâu?

CHỈNH SỬA:

Kịch bản của tôi được mô tả chi tiết hơn dưới đây:

  1. Phần mở rộng tập tin không xác định
  2. Tên chính xác (nghĩa là chữ viết hoa, số, v.v.) không xác định
  3. Vị trí của tệp không xác định

2
Nếu có một tệp được gọi Book1, và nó nằm trong một thư mục bạn có thể đọc, thì find / -iname book1sẽ tìm thấy nó. Bạn có chắc chắn nó thực sự Book1, và không Book1.xyz?
Fox

Tên đầy đủ của tệp là Book1.gnumeric. Bạn đang nói rằng tôi phải chỉ định toàn bộ tên của tập tin? Vì một số lý do tôi nghĩ, đối với lệnh cụ thể này, tất cả những gì tôi cần là tên chung của tệp. Thử nghiệm của tôi đang cố gắng tìm một tệp nếu chẳng hạn, tôi không nhớ phần mở rộng tệp và chỉ biết loại tên của tệp tôi đang tìm. Xin tư vấn.
Aspire27

@don_crissti Xong. Xin vui lòng xem ở trên Chỉnh sửa.
Aspire27

Bạn đang trộn find locate. locatelà hào phóng, và sẽ tìm thấy bất cứ điều gì phù hợp, miễn là nó có trong cơ sở dữ liệu của nó, thường được cập nhật hàng ngày. find, trong trường hợp này, đang tìm kiếm một tập tin toàn cầu, loại mẫu bạn sẽ sử dụng ls. Bạn có thể có nghĩa iname '*book1*'. Lưu ý rằng mẫu phải nằm trong dấu ngoặc kép để ngăn vỏ mở rộng trước khi findnhìn thấy nó. Cũng lưu ý rằng find, giống như nhiều lệnh * nix, im lặng một cách bực bội khi không thành công.
Manngo

Câu trả lời:


31

Đầu tiên, một đối số -inamelà một mẫu vỏ . Bạn có thể đọc thêm về các mẫu trong hướng dẫn Bash . Ý chính là findđể thực sự tìm thấy một tệp, tên tệp phải khớp với mẫu đã chỉ định. Để thực hiện một chuỗi case-insensitive book1trận đấu Book1.gnumericbạn có phải thêm *để nó trông như thế này:

find / -iname 'book1*'

hoặc chỉ định tên đầy đủ:

find / -iname 'Book1.gnumeric'

Thứ hai, -inamesẽ findbỏ qua trường hợp tên tệp để nếu bạn chỉ định -iname book1nó cũng có thể tìm thấy Book1, bOok1v.v. Nếu bạn chắc chắn rằng tệp bạn đang tìm kiếm được gọi Book1.gnumeric thì đừng sử dụng , -inamenhưng -namenó sẽ nhanh hơn:

find / -name 'Book1.gnumeric'

Thứ ba, hãy nhớ về việc trích dẫn mẫu như đã nói trong câu trả lời khác .

Và cuối cùng - bạn có chắc chắn rằng bạn muốn tìm tệp ở mọi nơi trên hệ thống của mình không? Có thể tệp bạn đang tìm kiếm thực sự nằm trong $HOMEthư mục của bạn nếu bạn đã làm việc trên đó hoặc tải xuống từ đâu đó. Một lần nữa, điều đó có thể nhanh hơn nhiều.

CHỈNH SỬA :

Tôi nhận thấy rằng bạn đã chỉnh sửa câu hỏi của bạn. Nếu bạn không biết tên tệp đầy đủ, viết hoa và vị trí thực sự bạn nên sử dụng một cái gì đó như thế này:

find / -iname 'book1*'

Tôi cũng đề nghị đặt 2>/dev/nullở cuối dòng để ẩn tất cả *permission denied*và các lỗi khác sẽ xuất hiện nếu bạn gọi findlà người dùng không root:

find / -iname 'book1*' 2>/dev/null

Và nếu bạn chắc chắn rằng bạn đang tìm kiếm một tệp duy nhất và chỉ có một tệp duy nhất trên hệ thống của bạn phù hợp với tiêu chí bạn có thể yêu cầu findđể thoát sau khi tìm thấy tệp phù hợp đầu tiên:

find / -iname 'book1*' -print -quit 2>/dev/null


6

Bạn có thể thử locatelệnh. Nó sử dụng cơ sở dữ liệu tên tệp để giúp tìm kiếm nhanh hơn.

Để tìm kiếm tất cả các tệp khớp *book1*và bỏ qua trường hợp, bạn có thể sử dụng

locate -i book1

nếu bạn muốn tìm kiếm các tập tin bắt đầu với book1bạn, bạn cần phải tự thực hiện ký tự đại diện:

locate -i 'book1*'

Nó nhanh hơn nhiều find, nhưng chỉ cập nhật như lần cuối cơ sở dữ liệu được làm mới.


5

Nếu bạn biết bạn có một tệp được gọi book1.something, vị trí tệp, giá trị chính xác somethingvà mẫu viết hoa của tên tệp đều không xác định:

find / -iname 'book1.*'

Nếu tất cả những gì bạn biết chắc chắn là tên tệp chứa từ đó book, bạn có thể tạo một danh sách có khả năng lớn hơn nhiều với

find / -iname '*book*'

Đối số -namelà một mô hình toàn cầu vỏ. Từ thư mục tập tin nằm trong, so sánh:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Điều này đại diện cho loại tìm kiếm được thực hiện bởi -name. Các -inametùy chọn đơn giản cho phép một phiên bản case-insensitive về điều này.


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Sẽ báo cáo đường đi của tất cả các file có tên chứa book1(với bất kỳ biến thể của vụ án mà chỉ xem xét các nhân vật Latin ASCII bokBOK, không phải là nhiều biến thể khác trong Unicode như 𝗄, 𝚔, 𝘬, , , , và tất cả các biến thể của họ với dấu ...) trong tất cả các thư mục bạn đã đọc truy cập vào.


0

Đối với những loại nhiệm vụ này, tôi luôn luôn làm: find / -iregex '.*Book1.*'

Biểu mẫu này sẽ xử lý 3 điểm trong kịch bản của bạn ( iregexlà một biểu thức hợp lý không phân biệt chữ hoa chữ thường và mẫu có.* cả hai mặt sẽ khớp với bất kỳ ký tự nào trước và sau mẫu Book1 cố định của bạn - điều này rõ ràng có thể mang lại cho bạn nhiều kết quả hơn mức cần thiết nhưng bạn chắc chắn không bỏ lỡ tập tin)

Sự khác biệt chính: nếu có thể, hãy hạn chế hơn chỉ sử dụng /, giống như cố gắng chỉ /homehoặc lâu hơn, nếu không bạn sẽ đi xuống trong một số thư mục mà không liên quan ( /sys, /dev, vv ...)

Tuy nhiên, hãy nhớ rằng các quyền Unix áp dụng: nếu tệp nằm trong thư mục mà người dùng đang chạy findlệnh không có quyền truy cập (thực thi), findsẽ không thể tìm thấy nó ở đó.


iregex sẽ không hoạt động ở những nơi như Solaris (Hệ điều hành không được chỉ định) (và có thể là * BSD), đây là một phần mở rộng GNU và không phải là một phần của tiêu chuẩnfind
Gert van den Berg

0

Silver Searcher là một ứng dụng rất nhanh và tiện dụng để tìm kiếm các tập tin và nội dung.

Để giải quyết vấn đề của bạn, lệnh tìm kiếm bạc sẽ như thế này ...

ag -g Book1

-g PATTERN In tên tập tin phù hợp với MẪU


0

locate và các biến thể của nó có xu hướng là một phương pháp nhanh.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Nếu định vị không có sẵn, bạn có thể sử dụng find thay thế. Nó có xu hướng chậm hơn nhiều, nhưng cũng chính xác hơn nhiều.

Nếu bạn có một phân vùng duy nhất: (chạy dưới quyền root nếu người dùng của bạn có thể không có quyền truy cập vào tệp)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Nếu bạn không bao gồm -xdev findcác tìm kiếm mọi thứ trên các phân vùng khác, như /proc/sys, có xu hướng tràn ngập màn hình của bạn với các lỗi, đặc biệt là nếu bạn không root. (Lỗi có thể được ẩn bằng cách nối thêm 2> /dev/nullvào cuối lệnh find (cần xóa bình luận))

Nếu bạn có nhiều phân vùng và bạn không biết tệp nào được bật, bạn có thể nhận danh sách với lsblk(trên các HĐH dựa trên Linux, phân tích cú pháp dfđầu ra là một tùy chọn khác) và đưa vào đó tìm: (root lại nếu bạn không biết nếu bạn có thể truy cập tập tin)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Điều này hơi mong manh nếu bất kỳ điểm gắn kết nào của bạn có khoảng trắng trong) ( dftham số có thể cần điều chỉnh. -P tạo GNUdf cung cấp đầu ra POSIX tiêu chuẩn. Các phiên bản khác có thể có các tham số khác hoặc cần bỏ qua. Đọc trang man của bạn)

Không grep -Fbao gồm những thứ khác được trả lại, như phân vùng trao đổi.

Trong phiên bản không phải GNU, awk tìm các thiết bị có giá trị bắt đầu bằng /devđể lấy các hệ thống tệp thực và sau đó in trường cuối cùng (điểm gắn kết) từ dfđầu ra.

Điều này cũng giả sử một lớp vỏ giống như bourne ( kshbashsẽ hoạt động. Nếu bạn đang sử dụng một cshbiến thể, hãy khởi động một lớp vỏ có thể viết được trước khi bạn thử điều này)


Các greps có thể hơi ồn, tìm hiểu cách lọc nó tốt hơn (ví dụ này không cần thiết, nhưng nếu đó là một cái gì đó phổ biến hơn được tìm kiếm, các greps sẽ cần điều chỉnh để giảm mức độ tiếng ồn)
Gert van den Berg

0

ag (trình tìm kiếm bạc) cung cấp tìm kiếm rất nhanh trong các tệp và cũng có tùy chọn để tìm kiếm tên tệp:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Vì vậy, trong trường hợp sử dụng của tôi ở đây, nó nhanh hơn> 30 lần nếu tệp không phải là tệp bị bỏ qua bởi ag.

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.