(Я припускаю 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