Nói chung, chuỗi rỗng không biểu thị thư mục hiện tại, không phải lệnh shell cũng như trong các cuộc gọi hệ thống. Nó đã làm trên một số hệ thống cũ, nhưng không phải trên các hệ thống tuân thủ POSIX .
Thỉnh thoảng bạn sẽ tìm thấy một chương trình sử dụng thư mục hiện tại khi bạn vượt qua một chuỗi trống và chương trình mong đợi một tên thư mục. Điều này đôi khi có chủ ý và đôi khi là tác dụng phụ của việc chuẩn bị đường dẫn tuyệt đối của thư mục hiện tại khi chuỗi đã cho không bắt đầu bằng dấu gạch chéo.
Điều tốt nhất cho bạn sẽ là rời khỏi ./
. Nó không làm hại gì cả.
Nếu danh sách các tập tin là cho
find . … | sed 's!^\./!!'
Lưu ý rằng điều này mang một số tên tập tin có chứa dòng mới. Điều này thường không phải là vấn đề đối với tiêu dùng của con người và đầu ra find
không phù hợp cho tiêu dùng chương trình vì nó không rõ ràng. Nếu bạn đang sử dụng -print0
, phù hợp với mức tiêu thụ chương trình, có lẽ bạn không quan tâm đến ./
tiền tố.
Bạn có thể sử dụng find * …
thay vì find . …
, nhưng lưu ý rằng find *
có một số khiếm khuyết khiến nó không phù hợp nói chung:
.
được bỏ qua.
- Tất cả các tệp chấm (tệp có tên bắt đầu bằng
.
hoặc ..`) bị bỏ qua.
- Nếu có một tên tệp trong thư mục hiện tại có tên bắt đầu bằng
-
(hoặc một tệp được gọi !
hoặc (
...), nó sẽ được hiểu là một tùy chọn hoặc vị ngữ theo find
.
Điểm đầu tiên không quan trọng nếu bộ lọc của bạn loại trừ thư mục hiện tại. Đối với điểm thứ hai, bạn có thể sử dụng các mẫu ..?* .[!.]* *
để khớp với tất cả các tệp trong thư mục hiện tại, nhưng bạn sẽ cần kiểm tra xem mỗi mẫu có khớp với ít nhất một tệp không và bỏ qua nếu không. Điều này là có thể nhưng rất cồng kềnh. Điểm cuối cùng là một nút chặn. Vì vậy, find *
có thể phù hợp để sử dụng dòng lệnh quickie, nhưng không sử dụng nó trong tập lệnh.
Một cách tiếp cận khác là sử dụng cơ sở khai thác đệ quy của vỏ, ví dụ
printf '%s\n' **/*.h
Điều này cần được kích hoạt bằng shopt -s globstar
bash và set -o globstar
trong ksh93, và không tồn tại trong vỏ POSIX cơ bản như dấu gạch ngang. Các tệp chấm sẽ không được duyệt theo mặc định; để bao gồm chúng, trước tiên hãy tạo toàn cầu không bỏ qua các tệp chấm với shopt -s dotglob
trong bash hoặc FIGNORE='@(.|..)'
trong ksh93. Ngoài ra, nếu không có kết quả khớp, thì lệnh này sẽ in mẫu; shopt -s nullglob
thay vào đó hãy chạy trong bash để in một dòng trống và sử dụng mẫu ~(N)**/*.h
trong ksh.
Trong zsh, mặc định đệ quy được bật theo mặc định. Sử dụng vòng loại toàn cầu D
để bao gồm các tệp chấm và N
để in một dòng trống nếu không có kết quả khớp (theo mặc định, zsh sẽ đưa ra lỗi nếu một mẫu không khớp với bất kỳ tệp nào). Bạn có thể sử dụng printf
như trên hoặc
print -rl -- **/*.h(DN)
find
có tham số -printf để thao tác cách hiển thị kết quả.find . -name '*.h' -printf '%P\n'
sẽ loại bỏ./
tiền tố. Xem những gìfind . -name '*.h' -print
không.