Как мне найти файл на моем жестком диске, который начинается с io_file
?
Я старался:
grep -r io_file*`
а также
find -name io_file*
find
ничего не возвратил, тогда как grep
кажется, стареет без результатов.
Что я делаю неправильно?
find / -name 'io_file*'
Первый параметр будет указывать, где должен начинаться поиск. /
означает весь ваш жесткий диск. Чтобы искать только в текущем каталоге (и подкаталогах), используйте: find .
Строка поиска должна быть заключена в кавычки, если она содержит метасимвол оболочки, такой как звездочка. В противном случае он будет проанализирован оболочкой и никогда не будет найден командой find
.
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 - поиск файлов в иерархии каталогов
IMO, использование поиска является медленным для всего поиска на жестком диске (оно также покажет вам много ошибок разрешений при доступе к файлам, которыми вы не владеете). Если возможно, используйте locate:
locate -b 'io_file*'
Вам, вероятно, придется переиндексировать файл, если он не старше 24 часов (обычно он устанавливает ежедневный хроноб):
sudo updatedb
find / -name 'io_file*'
Команда
# 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
Оболочка расширяет подстановочные знаки и передает результат в grep, поэтому вам нужно либо экранировать *
или использовать кавычки:
find / -name io_file\*
find / -name 'io_file*'
find / -name "io_file*"
Все три из них делают то же самое на моем компьютере с Linux.
find -name io_file*
будет искать в текущем каталоге и только ниже. Если вы хотите выполнить поиск по всему жесткому диску , вам необходимо указать путь: find / -name io_file*
. То же самое относится и к grep -r
; он будет искать только в текущем каталоге и ниже.
Утилита find
очень удобна, но ее использование может быть немного нелогичным. Я рекомендую вам прочитать справочную страницу поиска (man find
), она того стоит.
Поскольку вы не дали grep файл, он работает со стандартным вводом и ждет, когда вы что-то наберете. В любом случае, это неправильная команда. Что касается find, вам нужен каталог, с которого нужно начать, и вы должны поместить io_file*
в кавычки, в противном случае он расширяется оболочкой:
find / -name "io_file*"
Вы также можете использовать locate "io_file*"
который быстрее, но может быть неточным.