(Я предполагаю, что GNU findздесь)
Используя только
find filename
будет быстрым, потому что он просто вернет filenameили имена внутри, filenameесли это каталог, или ошибку, если этого имени не существует в текущем каталоге. Это очень быстрая операция, похожая на ls filename(но рекурсивная, если filenameэто каталог).
По сравнению,
find | grep filename
позволит findсоздать список всех имен из текущего каталога и ниже, который grepзатем будет отфильтрован. Это, очевидно, будет гораздо более медленной операцией.
Я предполагаю , что то , что было на самом деле предназначены было
find . -type f -name 'filename'
Это будет выглядеть filenameкак имя обычного файла в любом месте текущего каталога или ниже.
Это будет так же быстро (или сравнительно быстро) find | grep filename, но grepрешение будет соответствовать filenameполному пути каждого найденного имени, аналогично тому, что -path '*filename*'будет с find.
Путаница возникает из-за недопонимания того, как findработает.
Утилита берет несколько путей и возвращает все имена под этими путями.
Затем вы можете ограничить возвращаемые имена, используя различные тесты, которые могут воздействовать на имя файла, путь, метку времени, размер файла, тип файла и т. Д.
Когда ты говоришь
find a b c
Вы просите findперечислить каждое имя, доступное под тремя путями a, bи c. Если это имена обычных файлов в текущем каталоге, они будут возвращены. Если какое-либо из них окажется именем каталога, оно будет возвращено вместе со всеми последующими именами в этом каталоге.
Когда я делаю
find . -type f -name 'filename'
Это создает список всех имен в текущем каталоге ( .) и ниже. Затем он ограничивает имена имен обычных файлов, то есть не каталогов и т -type f. Д., С. Тогда есть дальнейшее ограничение на имена, которые соответствуют filenameиспользованию -name 'filename'. Строка filenameможет быть шаблоном подстановки имени файла, например *.txt(просто не забудьте процитировать его!).
Пример:
Кажется, следующее «находит» файл, вызываемый .profileв моем домашнем каталоге:
$ pwd
/home/kk
$ find .profile
.profile
Но на самом деле, он просто возвращает все имена по пути .profile(есть только одно имя, и это из этого файла).
Затем я cdподнимаюсь на один уровень и пытаюсь снова:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
Теперь findкоманда не может найти ни один вызванный путь .profile.
Однако, если я получу его, чтобы посмотреть на текущий каталог, а затем ограничить возвращаемые имена только.profile , он также найдет его оттуда:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile