Linux grep або знайти використання


4

Як знайти файл на своєму жорсткому диску, який починається з io_file?

Я намагався:

grep -r io_file*` 

і

find -name io_file*

findнічого не повернуло, тоді як, grepздається, проходять віки без жодних результатів.

Що я роблю неправильно?


1
grep and find не призначені для одного і того ж.

1
(не той самий Том, як на афіші)

При всій належній повазі до справжнього майстра пошуку, показаного в інших відповідях, альтернативою є встановлення ack . Це інструмент Perl, який має більш простий інтерфейс і включає в себе як основні функції пошуку, так і grep.
Юваль Ф

Відповіді:


11

find / -name 'io_file*'

Перший параметр вкаже, з чого слід починати пошук. /означає весь ваш жорсткий диск. Для пошуку лише в поточному каталозі (і підкаталогах) використовуйте:find .

Рядок пошуку повинен бути цитований, якщо він містить метахарактер оболонки, наприклад зірочку. В іншому випадку вона буде розібрана оболонкою і ніколи не побачиться find.


1
Не зовсім правда. Рядок пошуку буде розширений лише за наявності збігу , інакше він залишиться нерозширеним. Спробуйте, наприклад, "echo thisisnotafile *".
JesperE

1
Джеспер: це поведінка, що залежить від оболонки? Термінал, над яким я працюю, використовує tcsh, і цитування має значення навіть для назви файлів, які не розширюються.

Дякую за це. І як я можу сказати, що я хочу шукати в поточному каталозі, ЯКЩО Я ВСЕ як усі підкаталоги?

Просто змініть "/" на "." (без лапок) (Знову ж не плакат)

@John Millikin: дійсно, bash і tcsh мають іншу поведінку.
Бастієн Леонард

7
find / -name 'io_file*' -type f 2>/dev/null



   /: Start looking from root directory

   -type f: Only search for regular files

    2>/dev/null: Redirect errors to /dev/null. (handy if you are not root and
                 not interested in all the "access denied" messages)

Майте на увазі, що grep and find робіть різні речі.

grep шукає названі вхідні ФАЙЛИ (або стандартне введення, якщо файли не названі, або ім'я файлу - вказано) для рядків, що містять відповідність даному ПАТЕРНУ. За замовчуванням grep друкує відповідні рядки.

find - пошук файлів в ієрархії каталогів


-name pattern Не забудьте укласти шаблон у лапки, щоб захистити його від розширення оболонкою.

Thats зі сторінки пошуку чоловіка

@jcolebrand nope
Том

4

IMO, використання пошуку повільно для всього пошуку жорсткого диска (це також покаже вам багато помилок у дозволі під час доступу до файлів, якими ви не володієте). Якщо можливо, використовуйте locate:

locate -b 'io_file*'

Ймовірно, вам доведеться повторно індексувати, якщо файл новіший за 24 години (зазвичай він встановлює щоденну роботу):

sudo updatedb


2

Команда

# set -x

буде друкувати команди після розширення оболонки, щоб ви могли бачити, що відбувається

# find . -name letter.*
+ find . -name letter.rtf

... і тепер ви бачите, що оболонка розширює аргумент на ім'я letter.rtf, оскільки мій поточний довідник містить файл, який називається, letter.rtfщо відповідає шаблону.

Котирування шаблону (подвійні лапки також працюють у цьому випадку) зупинить розширення оболонки

# find . -name 'letter.*'
+ find . -name 'letter.*'

Щоб вимкнути його, використовуйте

# set +x

Ви також можете використовувати -xв рядку shebang, щоб побачити, які сценарії оболонки роблять, що може значно полегшити налагодження.

#!/bin/bash -x

0

Оболонка розширює підстановку та передає результат на вимикання, тому вам потрібно або вийти з *лапки, або використовувати лапки:

find / -name io_file\*
find / -name 'io_file*'
find / -name "io_file*"

Усі троє роблять те саме, що і в моєму вікні Linux.


0

find -name io_file*буде шукати лише в поточному каталозі та нижче. Якщо ви хочете знайти весь жорсткий диск, необхідно вказати шлях: find / -name io_file*. Те ж саме йде і з grep -r; він буде шукати лише в поточному каталозі та нижче.

findУтиліта дуже зручна, але вона може бути трохи нелогічним використовувати. Моя рекомендація полягає в тому, щоб ви прочитали man-сторінку пошуку ( man find), це вартує вкладеного часу.


0

Оскільки ви не дали файлу grep , він працює на стандартному вході та чекає, коли ви щось введете. Це все-таки неправильна команда. Щодо знаходження, вам потрібен каталог, з якого потрібно починати, і потрібно ставити io_file*лапки, інакше він розширюється оболонкою:

find / -name "io_file*"

Ви також можете використовувати те, locate "io_file*"що швидше, але може бути неточним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.