4

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

Я старался:

grep -r io_file*` 

а также

find -name io_file*

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

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

8 ответов8

11

find / -name 'io_file*'

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

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

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 и find делают разные вещи.

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

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

4

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

locate -b 'io_file*'

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

sudo updatedb
2
find / -name 'io_file*'
2

Команда

# set -x

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

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

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

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

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

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

# set +x

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

#!/bin/bash -x
0

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

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 find), она того стоит.

0

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

find / -name "io_file*"

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .