Sự khác biệt giữa tìm là gì. và tìm. -in


27

Sự khác biệt giữa:

find .

find . -print

Những gì -printthực sự làm?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

Câu trả lời:


41

Từ findutils findtrang hướng dẫn :

Nếu không có biểu thức nào được đưa ra, biểu thức -printđược sử dụng (nhưng có lẽ bạn nên xem xét sử dụng -print0thay thế).

( -printlà một findbiểu thức.)

Các tài liệu POSIX xác nhận điều này:

Nếu không có biểu thức nào , -print sẽ được sử dụng làm biểu thức.

Vì vậy, find .chính xác là tương đương với find . -print; đầu tiên không có biểu thức vì vậy -printđược thêm vào nội bộ.

Giải thích về những gì -printsẽ đi sâu hơn trong trang web:

-print

Thật; in tên tập tin đầy đủ trên đầu ra tiêu chuẩn, theo sau là một dòng mới. Nếu bạn đang chuyển đầu ra của tìm kiếm vào một chương trình khác và có khả năng rõ ràng nhất là các tệp mà bạn đang tìm kiếm có thể chứa một dòng mới, thì bạn nên nghiêm túc xem xét sử dụng -print0tùy chọn thay vì -print. Xem phần PHIM TUYỆT VỜI để biết thông tin về cách xử lý các ký tự bất thường trong tên tệp.


Loại câu hỏi cấp độ cho người mới bắt đầu nhưng biểu hiện này bạn đang nói về cái gì? đây là biểu hiện thường xuyên?
Rishi Prakash

2
@Rishi xem trang .
Stephen Kitt

20

-printhành động mặc định . Một số findvị từ được coi là hành động trái ngược với bộ lọc hoặc điều kiện . Chẳng hạn, -type fkhông phải là một hành động. -execlà một hành động mặc dù nó cũng có thể được sử dụng như một điều kiện.

Các hành động bao gồm -print, -exec-ok. Một số findtriển khai có vị từ hành động phi tiêu chuẩn khác như -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Trường hợp không <some-predicates>hành động nào tương đương với:

find files \( <some-predicates> \) -print

(lưu ý các dấu ngoặc đơn ở trên rất quan trọng nếu có một số -otoán tử).

Khi nghi ngờ, tốt nhất là sử dụng -printrõ ràng (hoặc -exec printf '%s\0' {} +(hoặc -print0nếu có) để đầu ra có thể được xử lý sau).

-printHành động mặc định được chỉ định bởi POSIX. Một số findtriển khai cũ đòi hỏi một sự rõ ràng-print , nhưng những thứ đó thường không được tìm thấy trong tự nhiên ngày nay.

Cũng lưu ý rằng một số findtriển khai cho phép bỏ qua files, trong trường hợp đó, chúng mặc định tìm kiếm vào thư mục hiện tại. Đó là, đối với họ,

find

tương đương với

find .
find . -print

Tuy nhiên, đó không phải là tiêu chuẩn, vì vậy tốt nhất nên tránh.

Ở phần cuối dài hơn (và hữu ích) của phổ, một số findtriển khai cũng cho phép chuyển các đường dẫn tệp làm đối số cho một -ftùy chọn như trong:

find -f "$file1" -f "$file2" -print

Chúng là các findtriển khai duy nhất cho phép chuyển các đường dẫn tệp tùy ý tới find. Các triển khai khác không thể chấp nhận các đường dẫn tệp như !hoặc -print... vì vậy find "$file" -print(hoặc thậm chí find -- "$file" -print) giả định $filekhông phải là tên của một findvị từ (hoặc tùy chọn trong trường hợp đầu tiên).

Thật không may, đó cũng không phải là tiêu chuẩn hay di động.


Nếu nó không chuẩn và tốt nhất nên tránh tại sao lại đặt tên cho nó?
Isaac

@Isaac, bởi vì chúng có thể tiện dụng / là những lỗi chính tả có thể ...
vonbrand

8

Chúng giống nhau, cả hai đều viết ra toàn bộ hệ thống phân cấp thư mục từ thư mục hiện tại.

Từ POSIX tìm tài liệu :

Các lệnh sau là tương đương:

tìm thấy .

tìm thấy . -in


4

Trong Linux không có sự khác biệt, nhưng các hệ thống khác (như AIX chẳng hạn) cần -printnếu bạn muốn đầu ra của lệnh được hiển thị trên màn hình của bạn.


3
Đó sẽ là phiên bản rất cũ của AIX. AIX 4.3 findkhông cần nó. AIX đã được POSIX tuân thủ trong nhiều thập kỷ.
Stéphane Chazelas

3

Trong nhiều năm, lệnh find không có hành động mặc định. Một lỗi phổ biến là quên thêm tùy chọn -print vào lệnh find của bạn. Tôi vẫn cho đến ngày nay loại nó ra khỏi thói quen.

Nhưng tại một số điểm, nó đã được thêm vào dưới dạng hành động mặc định find .và bây giờ find . -printlà tương đương.


1

Đôi khi rất hữu ích khi sử dụng -printrõ ràng khi bạn đang thực hiện một hành động khác để tên tệp được hiển thị khi hành động đó được thực hiện.

find . -print -delete

sẽ tương tự như

rm -rfv *

nơi -printtương ứng với -v. Nếu bạn không bao gồm -printthì tên tệp sẽ không được hiển thị.

Nhân tiện, để làm cho rmlệnh thậm chí giống nhau hơn, trước tiên, hãy ban hành lệnh Bash này

shopt -s dotglob

mà sẽ làm cho các *tập tin dấu chấm (ẩn) phù hợp.

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.