найти использование с -L

34

я имею

link -> file

я делаю

find -L . -name 'link'

И получить

./link

Почему это?

человек находит говорит:

-L: Следуйте по символическим ссылкам. Когда find проверяет или печатает информацию о файлах, используемая информация должна быть взята из свойств файла, на который указывает ссылка, а не из самой ссылки (если только она не является символической ссылкой или find не может проверить файл). на который указывает ссылка).

Анкур Агарвал
источник

Ответы:

12

С помощью -Lон проверяет свойства файла - содержимое или метаданные, а не ссылки. Например, если вы используете -atime, он проверит atimeфайл, а не ссылку:

$ find testdir/ -name link -newer testdir/ref
testdir/link
$ find -L testdir/ -name link -newer testdir/ref
$

testdir/linkбыл создан после testdir/ref, но файл, на который он указывает, не был.

Kevin
источник
1
Можете ли вы объяснить, принимая мой пример? Что я понимаю, это: в моем примере поиск начинает свой поиск. Он встречает ./link, поскольку -L в действительности разыменовывает его и принимает свойства ./file. Он сравнивает имя ./file с шаблоном 'link' и, поскольку он не совпадает, не должен сообщать о каких-либо o / p. Что не так с моими рассуждениями?
Анкур Агарвал
Из приведенного вами руководства по поиску «используемая информация должна быть взята из свойств файла, на который указывает ссылка». Имя файла не является одним из его свойств, поэтому он по-прежнему использует имя ссылки. Это также намного полезнее, чем имя реального файла.
Кевин
«Имя файла не является одним из его свойств», я не знал этого. Есть ли такие другие атрибуты файлов, которые не считаются свойствами? Если честно, я все еще скептически отношусь и буду ждать, что скажут другие.
Анкур Агарвал
Так же, как @abc, не знал, что имя файла не является свойством файла. Где я могу найти эту информацию в любой документации и / или справочной странице (страницах)? Пожалуйста, обратитесь к тому, где я могу узнать больше о свойствах файла.
Джокер
34

Общее правило состоит в том, что если команда работает со ссылками (то есть записями каталога, которые являются указателями на inode), то команда обрабатывает символические ссылки как сами по себе, а не как объект, на который указывает ссылка. В противном случае команда действует на то, на что указывает символическая ссылка. Таким cpобразом, по умолчанию следует символические ссылки и копируется содержимое файла, на который указывает ссылка. Но когда вы просите cpразобраться с записями каталога, указав -R, он перестает следовать символическим ссылкам. mvвсегда работает с записями каталога, и поэтому никогда не следует символическим ссылкам.

В findнормальной деятельности командования должны работать на записи каталога, так символьные ссылки не следует по умолчанию. Добавление -Lзаставляет findследовать символическим ссылкам для всех свойств, кроме того, которое нельзя игнорировать при выполнении поиска в каталоге, имени. Одной из целей find -nameявляется предоставление ввода для таких команд, как mvи rm, которые работают с записями каталога. Были бы неприятные и удивительные результаты, если find -L dir -nameбы можно было получить имена, которые указывали бы вне дерева каталогов с корнем dir.

Кайл Джонс
источник
ВОТ ЭТО ДА! Почему эта тонкая концепция не очень хорошо проиллюстрирована на страницах руководства (если я не пропустил ее)? Это большой сюрприз для меня.
Анкур Агарвал
2
@ Кайл Джонс There would be unpleasant and surprising results if находит, что -L dir -name` может создавать имена, которые указываются вне дерева каталогов с корнем в dir. => Не должно ли это быть: это будет неприятно ... если find dir -name pattern...? потому что добавление -L позволяет указывать на внешнюю
директорию
Так как же cp -Rскопировать материал по символической ссылке?
Джавадба