Tôi muốn biết liệu tôi có thể dựa vào hành vi mà tôi đang thấy khi sử dụng find
với -depth
tùy chọn không và người dùng không có quyền thực thi cho thư mục con.
Giả sử cấu trúc thư mục sau:
drwxrwxrwt. 10 root root 12288 Mar 14 04:31 .
dr-xr-xr-x. 24 root root 4096 Dec 6 03:33 ..
drwx------ 4 root root 4096 Mar 14 04:03 jen
Chạy lệnh sau với tư cách người dùng không root:
find -type d
Đầu ra là:
.
./jen
find: `./jen': Permission denied
Vì vậy, find
tìm thấy thư mục jen và đầu ra đó. Sau đó, nó đã cố gắng hạ xuống thành jen , nhưng không được phép nên nó đã in lỗi. Dòng đầu tiên ở trên được in stdout
và dòng thứ hai đến stderr
.
Bây giờ hãy chạy như sau với tư cách là người dùng không root:
find -depth -type d
Và đầu ra là:
find: `./jen': Permission denied
.
Vì vậy, tên đường dẫn không được xuất ra stdout
trừ khi người dùng có quyền liệt kê nội dung của thư mục.
Đầu ra này là hoàn hảo cho những gì tôi muốn làm. Tuy nhiên, tôi không chắc đây có phải chỉ là sự trùng hợp hay không. Tôi có thể dựa vào hành vi này không?
Tôi đang sử dụng công cụ tìm kiếm GNU 4.4.2. Tôi tự hỏi nếu hành vi này là giống nhau trên tất cả các phiên bản find
. Và nếu không, nó ít nhất giống nhau trên tất cả các phiên bản GNU tìm thấy.
Nó không quan trọng với tôi (đối với trường hợp sử dụng này) cho dù jen có được in trong ví dụ đầu tiên hay không . Tôi chỉ tự hỏi nếu tôi có thể phụ thuộc vào nó bị loại trừ khi -depth
được sử dụng. Thông thường, không nên dựa vào hành vi không có giấy tờ. Nhưng, với tôi, tác dụng phụ này có ý nghĩa. Vì vậy, tôi nghĩ rằng đây có thể là hành vi dự định .
Hướng dẫn nói:
- Tùy chọn: -thepth
Xử lý nội dung của mỗi thư mục trước thư mục chính nó.
Đây chính xác là những gì tôi muốn, nhưng không rõ tên đường dẫn của chính thư mục sẽ bị loại khỏi đầu ra nếu nó không đi vào nó.
Nhờ có một gợi ý từ Hauke Laging, tôi phát hiện ra rằng tôi có thể liệt kê chỉ mục và dứt khoát loại trừ thư mục nơi phép liệt kê nội dung của họ bị từ chối:
find -type d \( \( -type d \( \! -executable -or \! -readable \) \) -prune -or -print \)
Điều này cũng có tác dụng ngăn chặn các lỗi "Quyền bị từ chối" vì find
không bao giờ cố gắng truy cập vào một thư mục nếu nó không có quyền.
Thật không may, có hai lý do tại sao điều này sẽ không hoạt động cho nhu cầu của tôi.
- Tôi muốn thông báo lỗi
- Tôi cần
-depth
tùy chọn
Trích dẫn từ hướng dẫn
Nếu tùy chọn '-depth' có hiệu lực, các thư mục con sẽ được truy cập trong mọi trường hợp. Do đó '-prune' không có hiệu lực trong trường hợp này.
Vì vậy, tôi trở lại nơi tôi bắt đầu.
Vẫn chưa rõ liệu "Xử lý nội dung của từng thư mục trước chính thư mục đó". cũng có nghĩa là "Đừng xử lý thư mục nếu bạn không thể xử lý nội dung của nó".
.
là một lỗi sao chép và dán. Tôi đã cập nhật câu hỏi của mình với các chi tiết về các phiên bản và những chi tiết nào tôi hy vọng tôi có thể tin cậy.
./jen
cho find . -type d
. Nó vẫn là một phần của nội dung .
mặc dù find
không thể đi sâu vào nó. Không gì ./*
mẫu glob mở rộng ra trên Solaris 10? Có bao gồm ./jen
?
echo ./*
đầu ra ./jen
. Tôi thiết lập cấu trúc thư mục giống với OP. truss
cho thấy rằng find
không fchdir()
đến mở "."
fd, sau đó getdents64() = 72
, lstat64("jen",...) = 0
, openat(..., "jen", ...) => EACCES
, sau đó nó sẽ tạo ra các thông báo lỗi, sau đó getdents64() = 0
, sau đó dọn dẹp và thoát. Đây là trên bản phân phối Solaris 10 / x86 miễn phí gần đây nhất từ Oracle, Generic_147148-26, trong một phân vùng ufs
find
nào bạn muốn xem xét? Trên Solaris 10,find . -type d
in"."
ra thiết bị xuất chuẩn và thiết bị xuất"find: cannot read dir ./jen: Permission denied"
chuẩn.find . -depth -type d
in"find: cannot read dir ./jen: Permission denied"
ra stderr và"."
stdout. Không in"./jen"
ra thiết bị xuất chuẩn.