tìm lệnh trong Linux để định vị tệp pdf


11

Mục tiêu của tôi là tìm tất cả các tệp pdf trên một máy từ xa, vì vậy tôi dùng đến lệnh hữu ích find. Vì vậy, tôi gõ

tìm ~ * .pdf
hoặc là
tìm ~ "* .pdf"
và tôi không nhận được gì. Tôi làm tương tự trên máy của tôi và tôi không nhận được gì. Tôi thực hiện tìm kiếm thường xuyên từ menu trên máy của mình và tôi tìm thấy khá nhiều tệp pdf. Ai đó làm ơn cho tôi biết tôi đang làm gì sai?


11
Giữ ý kiến ​​tiêu cực của bạn bên ngoài câu hỏi của bạn nếu bạn muốn có một câu trả lời tốt. Trong một câu chuyện liên quan, findlà xa vô dụng.
wilmustell

8
Tất nhiên bạn có quyền tự do ngôn luận. Nhưng bạn muốn có một phản ứng tốt, phải không? Không, bạn không có quyền phản hồi mang tính xây dựng tốt. Đó là một đặc ân.
wilmustell

2
Một người lao động xấu thường đổ lỗi cho công cụ của mình. Nói cách khác, PBCAK thuần túy ở đây.
Pascal Thivent

5
@Wilmustell, tôi nghĩ rằng tuyên bố của Martin là công bằng - lệnh không bao giờ nên được đặt tên là "tìm" ở nơi đầu tiên, giống như "walkpath_and_execute" ... nó không có giao diện thân thiện với người dùng và trực quan nhất và còn hơn thế nữa hơn chỉ đơn giản là tìm tập tin. Tên đơn giản "tìm" là lừa đảo ở chỗ nó gợi ý một giao diện đơn giản mà nó không có. Chắc chắn, find rất xa vô dụng và hoạt động khá tốt, nhưng người ta khó có thể đổ lỗi cho người mới bắt đầu vì không biết sự khác biệt giữa "find", "xác định vị trí", "mà", v.v.
Michael Aaron Safyan

1
@Michael Tôi không đổ lỗi cho bất cứ ai ở đây; hoặc, đúng hơn, tôi không phải là người đổ lỗi ở đây. Tôi thậm chí không nói findlà trực quan. Tôi có lẽ có thể nói điều tương tự trong một giai điệu đẹp hơn; đôi khi tôi phản ứng với (ngớ ngẩn) bình luận tiêu cực.
wilmustell

Câu trả lời:


30

findlà xa vô dụng. Bạn chỉ không sử dụng đúng cách.

thử:

find . -type f -iname '*.pdf'


@Martin - Rất vui được giúp đỡ, chỉ cần chắc chắn đánh dấu câu hỏi là đã trả lời!
Mitch Dempsey

@stepancheg Vâng, tại sao bạn không gỡ xuống internet và in một bản sao cứng.
bobobobo

9

Hãy xem các tài liệu cho các findutils . Các findlệnh là một thứ vô cùng mạnh mẽ và, do đó, có một giao diện hơi phức tạp. Bạn có thể làm những gì bạn muốn với:

find . -type f -iname '*.pdf' 

Lệnh trên có nghĩa là "tìm bên trong. Đối với các mục của tệp loại có khớp tên không phân biệt chữ hoa chữ thường * .pdf (và in tên của các kết quả khớp đó)". Lệnh find thực sự có thể được sử dụng để thực thi các lệnh trên các tệp được tìm thấy (thay vì hoặc ngoài việc in tên tệp). Tuy nhiên, đối với mục đích của bạn, bạn có thể thấy thoải mái hơn với lệnh định vị , điều này - giả sử bạn đã xây dựng cơ sở dữ liệu định vị bằng cách sử dụng updateb - giúp tìm tệp rất dễ dàng. Ví dụ:

locate '*.pdf'

Bạn cũng sẽ thấy rằng lệnh định vị thường nhanh hơn lệnh find vì định vị sử dụng một chỉ mục tên tệp (cơ sở dữ liệu định vị), trong khi find sẽ đi theo cấu trúc phân cấp cho mỗi lệnh gọi.


6

Bạn chỉ đơn giản là thiếu vị ngữ nói những gì bạn đang tìm kiếm (ví dụ -name.)

Để tìm trong thư mục nhà theo tên:

find ~ -name \*.pdf

Lưu ý rằng ký tự đại diện *phải được thoát ra để lớp vỏ không diễn giải nó trước khi tìm được bàn tay của nó. Sử dụng '*.pdf'"*.pdf"sẽ có tác dụng tương tự như \*.pdf.

Để tìm trường hợp không nhạy cảm:

find ~ -iname \*.pdf

Để chỉ cắt các kết quả thành các tệp (biểu thức tên có thể sẽ đảm nhiệm việc này cho bạn, nhưng chỉ trong trường hợp bạn có bất kỳ thư mục có tên kỳ lạ nào):

find ~ -type f -iname \*.pdf

Để đảm bảo tìm thấy sau các liên kết tượng trưng (tôi thường muốn tự làm điều này khi thực hiện tìm kiếm):

find ~ -follow -type f -iname \*.pdf

Để thực hiện điều gì đó với các tệp bạn đã tìm thấy: bạn có thể kết xuất tệp này vào tệp bằng cách sử dụng chuyển hướng xuất chuẩn (ví dụ: giải quyết > filenameở cuối) hoặc sử dụng -exectùy chọn để chạy lệnh (xem trang man để biết chi tiết). Cái sau chạy một lệnh trên mỗi tệp tại một thời điểm, mặc dù. thường nhanh hơn khi để xargslệnh chuyển các tệp tìm thấy của bạn dưới dạng đối số sang lệnh khác, tất cả cùng một lúc hoặc khối lớn tại một thời điểm. Ví dụ: đối với các greps ad-hoc (nhưng không được lập trình) thông qua các tệp tiêu đề:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

Và một phần mở rộng cuối cùng, để làm cho lệnh cuối cùng đó hoạt động chính xác nếu bạn có tệp và thư mục có khoảng trắng trong đó:

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"

Trên thực tế, "* .pdf" sẽ mở rộng nếu có các tệp trong thư mục hiện tại kết thúc bằng .pdf, phải không? (lưu ý nhỏ)
Peter Jaric

1
Không trong bash. Từ sổ tay bash: "Việc đóng dấu các ký tự trong dấu ngoặc kép sẽ giữ giá trị bằng chữ của tất cả các ký tự trong dấu ngoặc kép, ngoại trừ [đô la], [backquote], [pipe] và khi bật mở rộng lịch sử, [bang]. " Hãy tự mình thử xác nhận: ls "* .txt" trên một thư mục chứa các tệp văn bản trong đó.
Owen S.

Vâng, bạn đúng, tất nhiên. Tôi không biết tôi lấy ý tưởng đó từ đâu. Cảm ơn vì đã sửa tôi.
Peter Jaric

3

hãy xem hướng dẫn này

tôi nghĩ những gì bạn muốn làm là

find . -name "*.pdf"

Bạn nên sử dụng inamethuộc tính để có tầm nhìn hành lang tốt hơn
Mitch Dempsey

0

Tôi đã sử dụng để kết hợp tìm kiếm với grep như

tìm thấy . . | grep -i ".pdf"

có thể không hiệu quả hàng đầu, nhưng nó làm công việc tốt.


Điều này có thể được thực hiện findtrực tiếp nếu bạn muốn, thông qua -iregex: find ~ -iregex '.*\.pdf'. Vấn đề là, trong findmô hình được xử lý như nó luôn có một ^ở phía trước và một $ở phía sau, vì vậy mô hình của bạn cần phải phức tạp hơn một chút. Cũng lưu ý: .trong mẫu của bạn thực sự là ký tự đại diện một ký tự, không phải là một khoảng thời gian theo nghĩa đen.
Owen S.

0

Tìm tệp bạn cần tải xuống trong vòng x ngày qua

find ~ -type f -iname '*.pdf' -mtime -1

sẽ tìm cho bạn các tệp pdf trong thư mục chính của bạn ~và bên dưới với phần mở rộng .pdfbất kể chữ hoa và chữ thường (đó là tôi iname) và sửa đổi tối đa 1 ngày trước vì tôi đã thêm mtime -1; nếu bạn đặt -60 trong mtime thì sẽ là 60 ngày qua.


0

Để thực hiện tìm kiếm trong các tệp "tìm thấy" có cấu trúc này:

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

Lệnh exec phải kết thúc bằng lệnh ";" và -H là cần thiết cho grep để in ra đường dẫn tệp ngoài dòng trong tệp có "chuỗi".

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.