Linux grep или найти использование

1789
Peter Mortensen

Как мне найти файл на моем жестком диске, который начинается с io_file?

Я старался:

grep -r io_file*` 

а также

find -name io_file* 

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

Что я делаю неправильно?

4
grep и find не предназначены для одного и того же. 14 лет назад 1
(не тот же Том, что и плакат) 14 лет назад 1
При всем уважении к истинному волшебству поиска, показанному в других ответах, альтернативой является установка [ack] (http://betterthangrep.com/). Это инструмент Perl, который имеет более простой интерфейс и включает в себя основные функции find и grep. Yuval F 14 лет назад 0

8 ответов на вопрос

11
John Millikin

find / -name 'io_file*'

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

Строка поиска должна быть заключена в кавычки, если она содержит метасимвол оболочки, такой как звездочка. В противном случае он будет проанализирован оболочкой и никогда не будет виден find.

Не совсем верно. Строка поиска будет расширена ** только при наличии соответствия **, в противном случае она не будет расширена. Попробуйте "echo thisisnotafile *", например. JesperE 14 лет назад 1
Джеспер: это поведение, зависящее от оболочки? Терминал, из которого я работаю, использует tcsh, и кавычки имеют значение даже для имен файлов, которые не могут быть расширены. 14 лет назад 1
Спасибо за это. И как я могу сказать, что я хочу посмотреть в текущем каталоге, как хорошо, как все подкаталоги? 14 лет назад 0
Просто измените «/» на «.» (без кавычек) (опять же не афиша) 14 лет назад 0
@ Джон Милликин: действительно, bash и tcsh ведут себя по-разному. Bastien Léonard 14 лет назад 0
7
Tom
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 и find делают разные вещи.

grep ищет в именованных входных ФАЙЛАХ (или в стандартном вводе, если не указано ни одного файла, или указано имя файла) строки, содержащие совпадение с заданным ШАБЛОНОМ. По умолчанию grep печатает совпадающие строки.

find - поиск файлов в иерархии каталогов

-name pattern Не забудьте заключить шаблон в кавычки, чтобы защитить его от раскрытия оболочкой. 14 лет назад 0
вот со страницы поиска найти 14 лет назад 0
@jcolebrand Нету Tom 12 лет назад 0
4
LiraNuna

IMO, использование поиска является медленным для всего поиска на жестком диске (оно также покажет вам много ошибок разрешений при доступе к файлам, которыми вы не владеете). Если возможно, используйте locate:

locate -b 'io_file*' 

Вам, вероятно, придется переиндексировать, если файл новее 24 часов (обычно он устанавливает ежедневный cronjob):

sudo updatedb 
2
Gavin H
find / -name 'io_file*' 
2
Peter Mortensen

Команда

# set -x 

напечатает команды после расширения оболочки, чтобы вы могли видеть, что происходит

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

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

Цитирование шаблона (в этом случае также работают двойные кавычки) остановит расширение оболочки

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

Чтобы выключить его, используйте

# set +x 

Вы можете также использовать -xна притон линии, чтобы увидеть, что сценарии оболочки делают, которые могут значительно помочь отладки.

#!/bin/bash -x 
0
Graeme Perrow

Оболочка расширяет подстановочные знаки и передает результат в grep, поэтому вам нужно либо экранировать, *либо использовать кавычки:

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

Все три из них делают то же самое на моем компьютере с Linux.

0
JesperE

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

findУтилита очень удобна, но она может быть немного нелогичным использовать. Я рекомендую вам прочитать man-страницу find ( man find), она того стоит.

0
sgm

Поскольку вы не дали grep файл, он работает со стандартным вводом и ждет, когда вы что-то наберете. В любом случае, это неправильная команда. Что касается find, вам нужен каталог, с которого нужно начинать, и io_file*кавычки, иначе он расширяется оболочкой:

find / -name "io_file*" 

Вы также можете использовать, locate "io_file*"который быстрее, но может быть неточным.

Похожие вопросы