Я хочу найти определенный тип файла (.jpeg) по заданному пути очень эффективным способом.
У меня сейчас 2 варианта
ls- R | grep .jpeg
- используйте
'find'
какой из них лучше? Есть ли лучший подход, чем этот?
Я бы использовал find /somewhere/on/disk -name "*.jpeg"
поверх ls
.
Существует также опция locate *.jpeg
которая использует базу данных. Однако эта база данных обновляется только через регулярные промежутки времени (как правило, из задания cron
), поэтому некоторые файлы, возможно, еще не были проиндексированы во время вызова команды locate
что приводит к менее точному результату. Вы можете принудительно создать или обновить эту базу данных, вызвав команду updatedb
.
О find
против исполнения ls
ls
будет сортировать вывод , который занимает много времени , пока вы не обязательно нужен. Кроме того, ls
выведет много информации, которая впоследствии должна быть отфильтрована grep
.
Ссылка:
Я всегда был фанатом находок, с этим можно многое сделать:
find /starting/path -type f -name "*.jpeg"
Так что, если я хочу начать с моего домашнего каталога:
find /home/john -type f -name "*.jpeg"
Возможно, вы захотите поискать .jpg и .jpeg (3-х буквенное расширение из дней DOS), поскольку файлы могут быть названы в любом случае:
find . -type f \( -name "*.jpg" -o -name "*.jpeg" \)
Зависит от того, что вы хотите в результате. ls -R
не скажет вам, в каком каталоге он нашел файл, а find
найдет.
Кроме того, ls -R генерирует больше выходных данных, которые впоследствии фильтруются, в то время как find
ищет именно то, что вы хотели. Без проведения измерений я бы предположил, что find
как правило, более эффективен.
Вы также можете сопоставить файлы в.JPG и.JPEG заглавными буквами. С помощью find вы можете добавить -name '*.JPG' -name '*.JPEG'
, или вы могли бы найти поиск по grep (да, это немного некрасиво):
find . -type f | grep "\.[Jj][Pp][Ee]\?[Gg]$"
Это будет соответствовать:
find ./ -name *.jpg -print
Я обычно использую
find . -name *.jpg -print {} \;
Найти, безусловно, лучший инструмент для этой работы.
Вывод ls -R будет трудно проанализировать (имена файлов чередуются с именами каталогов). Кроме того, с ls вам будет трудно иметь дело с именами с пробелами, пока вы найдете. -name '* .jpeg' -print0 создаст список, разделенный нулевыми символами. У xargs, grep и других есть возможность прочитать этот тип ввода. Это означает, что все странные имена сохраняются.
Установите "найти" или "локализовать"
Запустите "updatedb" и "locate \*. Jpeg"
updatedb создает базу данных индексов для имен файлов в вашей системе.
locate найдет файл из базы данных вместо сканирования каталога по каталогу.
Это быстрее, если вы делаете много поиска после каждой сборки базы данных. Возможно, вы захотите настроить задание cron для запуска команды updatedb.
Это похоже на Google Desktop Search, но только для поиска по имени файла.