(Я предполагаю, что 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