Làm thế nào để tôi thực hiện tìm kiếm theo hầu hết, nhưng không phải tất cả, các liên kết tượng trưng?


10

Hệ điều hành và thư mục nhà của tôi nằm trên ổ SSD. Tôi lưu trữ một số tệp lớn trên đĩa cứng và symlink từ thư mục chính của tôi vào đĩa cứng (ví dụ: ~ / Video / Films là một liên kết tượng trưng đến / mnt / hdd / Films). Tôi cũng có một số tiền tố Wine, mỗi tiền tố có dosdevices / z: symlinked to /.

Vì vậy, nếu tôi sử dụng find mà không có -L, nó sẽ bỏ lỡ mọi thứ trên đĩa cứng. Nhưng nếu tôi sử dụng find với -L, nó sẽ kết thúc trong một vòng lặp do liên kết tượng trưng của Wine tới /.

Có cách nào hợp lý để giải quyết vấn đề này, để tìm các tìm kiếm nơi tôi muốn không? Theo trực giác, tôi muốn một cái gì đó dọc theo dòng chữ "theo liên kết tượng trưng, ​​trừ khi chúng nằm trong một thư mục có tên là dosdevices". "Theo các liên kết tượng trưng cho một cái gì đó trên đĩa cứng" cũng sẽ hoạt động.

Câu trả lời:


11

Chính -prunenói findkhông tái diễn dưới một thư mục.

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

Nếu bạn muốn sử dụng -lnametrong điều kiện của mình, bạn không thể sử dụng -Ltùy chọn này, vì -Lkhiến hầu hết các vị từ hành động theo mục tiêu của liên kết, bao gồm cả -lname. Đề nghị của tôi trong trường hợp đó là sử dụng cả thư mục chính của bạn và thư mục gốc của đĩa cứng làm gốc tìm kiếm của bạn.

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

Bạn có thể chạy find ~ -type l …để thu thập một danh sách các liên kết tượng trưng và sử dụng chúng như các gốc bổ sung.

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

Nếu bạn thực sự muốn lặp lại theo các liên kết tượng trưng, ​​bạn có thể loại trừ các liên kết tượng trưng cụ thể theo mục tiêu thay vì theo tên. Tuy nhiên, bạn chỉ có thể loại trừ một danh sách hữu hạn, không phải là một mẫu hoặc cây con theo cách này.

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

Bạn có thể sử dụng các tiêu chí khác, chẳng hạn như ! -writable(các tệp mà bạn không có quyền ghi), nhưng tôi không nghĩ GNU find có cách để lặp lại theo các liên kết tượng trưng chỉ khi văn bản đích của chúng khớp với một biểu thức nhất định.

Bạn có thể xây dựng một findlệnh thực hiện gần như những gì bạn muốn ngoại trừ không loại trừ đủ các liên kết tượng trưng, ​​chạy find2perl để chuyển đổi truy vấn thành tập lệnh Perl và điều chỉnh tập lệnh Perl một chút. Tuy nhiên, có nhiều công tắc của GNU thấy rằng find2perl không nhận ra.


Cảm ơn! -prunechỉ là thứ tôi đang tìm kiếm. Tôi đã thấy rằng find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype dliệt kê tất cả các liên kết tượng trưng mà tôi không muốn theo dõi; Bây giờ tôi đang cố gắng tìm cách sử dụng truy vấn đó để cắt tỉa.
Đánh dấu Raymond

@MarkRaymond Nguyên tắc chung là find ~ <negative criteria> -prune -o <positive criteria> -print, vì vậyfind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
Gilles 'SO- ngừng trở nên xấu xa'

@Giles - hoạt động tốt mà không có -L, nhưng một khi tôi thêm -L, các biểu thức -lname không hoạt động nữa (như trang người đàn ông nói rằng họ sẽ không). Vì vậy, về cơ bản sau đó tôi cần một số điều kiện để theo symlink và những người khác thì không!
Đánh dấu Raymond

Tôi không thể nghĩ ra một cách làm chính xác những gì bạn muốn với tìm kiếm. Xem chỉnh sửa của tôi cho một số xấp xỉ.
Gilles 'SO- ngừng trở nên xấu xa'

1

Để tìm kiếm TẤT CẢ các liên kết, điều này làm việc cho tôi:

find -L . -name \*.txt

0

Bạn có bao nhiêu symlink đến đĩa cứng? Nếu không có quá nhiều một giải pháp là không sử dụng "-L" trong khi chỉ định rõ ràng các liên kết tượng trưng mà bạn muốn theo dõi trên dòng lệnh find. Cái gì đó như:

find .  ~/Videos/Films -name '*file I want*' ...

Điều này sẽ tìm kiếm thư mục hiện tại (".") Cũng như liên kết tượng trưng "~ / Video / Phim" nhưng sẽ không chuyển sang các liên kết tượng trưng khác.


0

Một giải pháp khác giúp giải quyết vấn đề (ít nhất là đối với trường hợp của tôi) là sử dụng các liên kết gắn kết thay vì các liên kết tượng trưng cho các thư mục trên đĩa cứng. Điều này được thực hiện bằng cách thêm các mục trong /etc/fstabnhư thế này:

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

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.