tìm không hoạt động trên đường dẫn symlinked?


13

Nếu tôi chạy lệnh này thì find $HOME/MySymlinkedPath -name "run*.sh"không có gì xảy ra và không có lỗi ('MySymlinkedPath' là đường dẫn được liên kết đến một ổ cứng khác, sau đó là $ HOME của tôi).

Những điều này cũng thất bại:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"

Và để chắc chắn, đường dẫn không tồn tại này (tất nhiên) không thành công find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"nên đường dẫn đang được tìm thấy (vì lỗi đó không xảy ra) nhưng findkhông thực hiện tìm kiếm trên đó và hiện tại tôi rất không biết gì.

Nó chỉ hoạt động nếu tôi cd $HOME/MySymlinkedPathlần đầu tiên và loại bỏ tham chiếu đường dẫn như thế này find -name "run*.sh"nhưng điều đó không tốt cho các tập lệnh của tôi.

Một thông tin bổ sung :
lệnh này hoạt động như bình thường ls $HOME/MySymlinkedPath/run*.shvà nếu tôi đến đó cd $HOME/MySymlinkedPathvà chạy ls ..thì kết quả này không như tôi mong đợi - danh sách đường dẫn có đường dẫn liên kết tượng trưng - nó trả về danh sách đường dẫn thực các phương tiện truyền thông / ổ cứng khác !!!

pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath

Suy nghĩ lại :
Đây có phải là một vấn đề với findls, hoặc với hệ thống của tôi? hoặc nó được mong đợi và không phải là một vấn đề gì cả ?? Tôi đang dùng Ubuntu 12.10. Nó không thành công trên tất cả các thiết bị đầu cuối mà tôi đã kiểm tra nên dường như không có "vấn đề" nào.


1
Tôi tìm thấy một câu trả lời tốt hơn "find -follow". stackoverflow.com/questions/105212/
Mạnh

Trang man @Jarod nói -follow không được dùng nữa và chúng ta nên sử dụng -L (cũng là --follow) như câu trả lời của tôi dưới đây:>
Aquarius Power

Câu trả lời:


19

Đây là câu trả lời. Nhưng câu hỏi đó chỉ ra bash là mục tiêu của vấn đề.

Giải thích là findtìm thấy "$HOME/MySymlinkedPath". Đó là một liên kết tượng trưng, ​​không phải là một thư mục, vì vậy dòng dõi đệ quy dừng ở đó. Nếu biểu thức khớp "$HOME/MySymlinkedPath"(ví dụ: in find "$HOME/MySymlinkedPath" -name 'My*'), thì findsẽ in biểu thức đó dưới dạng khớp.

Như đã chỉ ra ở đó, tôi thấy rằng cách dễ nhất / sạch nhất để xử lý và sửa tất cả các tập lệnh là, thay vì:

find "$HOME/MySymlinkedPath" -name "run*.sh"

chỉ cần thêm một dấu gạch chéo, để findbắt đầu không phải từ liên kết tượng trưng mà từ mục tiêu của liên kết tượng trưng:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

Ngoài ra, chuyển -Htùy chọn đến find(lưu ý rằng nó phải đến trước, trước các đường dẫn) để báo cho nó biết các liên kết tượng trưng truyền qua dòng lệnh của nó. (Điều này khác với -Lviệc nói findvới các liên kết tượng trưng đi qua gặp phải trong quá trình gốc đệ quy.)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

Và cuối cùng nó hoạt động tốt nhất ở đây với -L(vì một số hệ thống tập tin tôi có các thư mục thông qua liên kết tượng trưng). Nhưng nó tạo ra vô số thông báo lỗi không có vấn đề nên tôi đã thêm vào 2>/dev/null; và cũng quyết định tạo bí danh này alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

2
IMHO, nói chung nên sử dụng dấu gạch chéo sau các thư mục để chỉ ra rằng chúng thực sự là các thư mục. :) Làm cho mọi thứ dễ đọc hơn, v.v.
dannysauer
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.