Câu trả lời:
Các lý do tại sao bạn thấy điều này là bởi vì các nhà phát triển của GNU chọn để cung cấp một hành vi "hợp lý" cho khi không có đường dẫn được đưa ra. Ngược lại, POSIX không nói rằng tham số là tùy chọn:find
find
Các
find
tiện ích đệ quy sẽ xuống hệ thống phân cấp thư mục từ mỗi tập tin theo quy định của con đường , đánh giá một biểu thức Boolean gồm bầu cử sơ bộ được mô tả trong phần OPERANDS cho mỗi tập tin gặp phải. Mỗi toán hạng đường dẫn sẽ được đánh giá không thay đổi khi được cung cấp, bao gồm tất cả các<slash>
ký tự dấu ; tất cả các tên đường dẫn cho các tệp khác gặp phải trong cấu trúc phân cấp sẽ bao gồm nối các toán hạng đường dẫn hiện tại,<slash>
nếu toán hạng đường dẫn hiện tại không kết thúc bằng một và tên tệp liên quan đến toán hạng đường dẫn. Phần tương đối sẽ không chứa các thành phần dấu chấm hoặc dấu chấm, không có dấucác ký tự và chỉ các<slash>
ký tự đơn giữa các thành phần tên đường dẫn.
Bạn có thể thấy sự khác biệt trong bản tóm tắt cho mỗi. GNU có (theo quy ước) các mục tùy chọn trong ngoặc vuông:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
[expression]
trong khi POSIX không chỉ ra rằng nó có thể là tùy chọn:
find [-H|-L] path... [operand_expression...]
Trong chương trình GNU, điều đó được thực hiện trong ftsfind.c
:
nếu (trống) { / * * Chúng tôi sử dụng một biến tạm thời ở đây vì một số hành động sửa đổi * đường dẫn tạm thời. Do đó, nếu chúng ta sử dụng hằng chuỗi * chúng tôi nhận được một coredump. Ví dụ tốt nhất về điều này là nếu chúng ta nói * "find -printf% H" (lưu ý, không phải "find. -printf% H"). * / char defaultpath [2] = "."; trả về tìm (defaultpath); }
và một nghĩa đen "."
được sử dụng cho đơn giản. Vì vậy, bạn sẽ thấy kết quả tương tự với
find
và
find .
bởi vì (và POSIX đồng ý) đường dẫn đã cho sẽ được sử dụng để tiền tố kết quả (xem phần trên để nối ).
Với một chút công việc, người ta có thể xác định khi nào tính năng này được thêm lần đầu tiên; nó đã có mặt trong lần đầu tiên tạo ra "findutils" vào năm 1996 (xem find.c
):
+ /* If no paths are given, default to ".". */
+ for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+ process_top_path (argv[i]);
+ if (i == 1)
+ process_top_path (".");
+
+ exit (exit_status);
+}
Từ thay đổi cho tìm 3,8, điều này rõ ràng là
Sat Dec 15 19:01:12 1990 David J. MacKenzie (djm at egypt)
* find.c (main), util.c (usage): Make directory args optional,
defaulting to "."
Thông thường, người ta xử lý hậu kỳ các tệp và trong trường hợp đó, có thể có một lợi thế rất lớn để bắt đầu tên tệp ./
. Cụ thể, nếu một tên tệp bắt đầu bằng -
, một lệnh tiếp theo có thể diễn giải tên tệp đó là một tùy chọn. ./
tránh điều đó
Ví dụ, xem xét một thư mục với các tệp này:
$ ls
--link --no-clobber
Bây giờ, hãy tưởng tượng lệnh này sẽ hoạt động như thế nào nếu tên tệp được cung cấp mà không có ./
phía trước:
$ find -type f -exec cp -t ../ {} +
Chúng ta có thể minh họa vấn đề với find
chính nó. Hãy chạy nó trong cùng thư mục như trên. Các công việc sau đây:
$ find ./*
./--link
./--no-clobber
Lỗi sau:
$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.
file
yêu cầu người dùng đưa ra một đường dẫn (như tìm thấy BSD trên OS X). Vì vậy, bạn thường cần phải nói rõ ràng một cái gì đó như find . -type f ...
. Từ đó, không phải là một bước tiến lớn đối với một số phiên bản tìm kiếm (như GNU find) chỉ mặc định .
và để mọi thứ khác như hiện tại.
find *
không hiển thị .
là vì *
liệt kê tất cả các tệp và thư mục, nhưng loại trừ .
. Làm echo *
trong một thư mục chỉ chứa một hoặc hai tệp và bạn sẽ thấy nó .
không được liệt kê. Do đó, find *
hoạt động trên mỗi tập tin mở rộng. Nó giống như bạn nói find Desktop/
từ thư mục nhà. Bạn sẽ thấy đầu ra làDesktop/foo_bar.txt
find
hành xử theo cách của nó. Bạn có bất kỳ thông tin tham khảo có thẩm quyền để hỗ trợ cho yêu cầu ngụ ý find
được thiết kế để hành xử theo cách này vì lý do này?
Các find
nhu cầu lệnh đường dẫn (s) để tìm kiếm. Nếu chúng tôi không chỉ định bất kỳ, nó sử dụng thư mục hiện tại ( .
) làm điểm bắt đầu. Tương tự, nếu bạn vượt qua đường dẫn, ví dụ /tmp
, nó coi đó là điểm bắt đầu. Và do đó, kết quả.
Nếu thư mục hiện tại:
$ find
or
$ find .
output:
./file1
./file2
./file3
Nếu /tmp
thư mục:
$ find /tmp
output:
/tmp/file4
/tmp/file5
Nếu abc
thư mục trong thư mục hiện tại:
$ find abc
output:
abc/file6
abc/file7
Nếu nhiều thư mục trong thư mục hiện tại:
$ find fu bar
output:
fu/file10
fu/file11
bar/file8
bar/file9
find
cần một đường dẫn để tìm kiếm bất cứ thứ gì và nó mặc định là thư mục hiện tại. Câu hỏi là tại sao nó in ra hàng đầu ./
khi file.txt
chỉ giống như ./file.txt
.
Nếu bạn không chỉ định một đường dẫn, find
lệnh sẽ giả sử ${PWD}
là đường dẫn và in nó ra trên đầu ra của nó. Người dùng không chỉ định đường dẫn không thay đổi cách find
làm việc. Và tìm luôn hoạt động với các đường dẫn theo mặc định.
/tmp
, sau đó $PWD
là /tmp
không ./
.
/tmp
, hãy chạy lệnh find /tmp
Nếu bạn không chỉ định đường dẫn, nó sẽ luôn là thư mục hiện tại, đó là./
/tmp
. Đó là nó không thể $PWD
.
${PWD}
là thông báo không chính xác
find .
, find $PWD
và find
(không có một con đường, nếu tìm bạn hỗ trợ nó).
find *
.