1

В моей директории у меня есть несколько символических ссылок, которые указывают на «/Volumes/Macintosh HD 2/...», и я хочу найти их все рекурсивно. Если вы посмотрите на справочную страницу «find», то аргумент «-lname» будет искать содержимое символической ссылки. Кажется, работает, но не рекурсивно:

$ pwd
/Users/myusername
$ sudo find . -lname '/Volumes*' 
$ cd Documents/
$ sudo find . -lname '/Volumes*' 
./Documents on Win7
./work.rtf

В чем дело? Как я могу заставить эту работу рекурсивно? - Программа 'find' должна всегда работать рекурсивно.

Я проверил химической завивки, они выглядят хорошо, но, как вы можете видеть, я использовал "sudo" просто чтобы быть уверенным ... без кости.

$ ls -ld Documents/
drwx------+ 14 myusername  staff  476 Jan 12 16:32 Documents/

1 ответ1

2

Это похоже на ошибку в тестировании предиката -lname , и это гораздо более странно, чем просто не повторяться. Из моего тестирования кажется, что он работает только с файлами той же глубины, что и текущий рабочий каталог (т . Е. Если вы были в ~/Documents и запустили find .. -lname '/Volumes*' , он найдет ссылки в ~/ Документы и ~/ Desktop, и т.д., Но НЕ любые ссылки в ~). Но есть (по крайней мере, согласно моему тестированию) обходной путь: кажется, что он работает, если начальный каталог является абсолютным путем, поэтому используйте find "$PWD" -lname '/Volumes*' вместо find . -lname '/Volumes*' похоже, чтобы избежать проблемы. Вот последовательность тестов, чтобы проиллюстрировать это:

Mac:~ test$ mkdir -p sub1/subsub1 # Create some folders and links to work with
Mac:~ test$ mkdir -p sub2/subsub2
Mac:~ test$ ln -s sometarget toplink
Mac:~ test$ ln -s sometarget sub1/sub1link
Mac:~ test$ ln -s sometarget sub1/subsub1/subsub1link
Mac:~ test$ ln -s sometarget sub2/sub2link
Mac:~ test$ ln -s sometarget sub2/subsub2/subsub2link
Mac:~ test$ find . -lname "*" # This only finds links at the top of the home directory
./toplink
Mac:~ test$ cd sub1
Mac:sub1 test$ find . -lname "*"
./sub1link
Mac:sub1 test$ find .. -lname "*" # This only finds links one level down
../Pictures/iChat Icons
../sub1/sub1link
../sub2/sub2link
Mac:sub1 test$ cd subsub1
Mac:subsub1 test$ find ../.. -lname "*" # This only finds links two levels down
../../sub1/subsub1/subsub1link
../../sub2/subsub2/subsub2link
Mac:subsub1 test$ find ../.. -lname "*" -o -name "*sub2*" # The -name predicate works fine
../../sub1/subsub1/subsub1link
../../sub2
../../sub2/sub2link
../../sub2/subsub2
../../sub2/subsub2/subsub2link
Mac:subsub1 test$ find /Users/test -lname "*" # It works as expected with an absolute starting path
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.AddressBook
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.Dashboard
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.Dock
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.iCal
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.Keychain
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.Mail
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.PreferenceSync
/Users/test/Library/Application Support/SyncServices/Local/clientdata/com.apple.Safari
/Users/test/Pictures/iChat Icons
/Users/test/sub1/sub1link
/Users/test/sub1/subsub1/subsub1link
/Users/test/sub2/sub2link
/Users/test/sub2/subsub2/subsub2link
/Users/test/toplink

Я отправлю это в bugreporter Apple.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .