1

Я хочу найти определенный тип файла (.jpeg) по заданному пути очень эффективным способом.

У меня сейчас 2 варианта

  1. ls- R | grep .jpeg
  2. используйте 'find'

какой из них лучше? Есть ли лучший подход, чем этот?

9 ответов9

6

Я бы использовал find /somewhere/on/disk -name "*.jpeg" поверх ls .

Существует также опция locate *.jpeg которая использует базу данных. Однако эта база данных обновляется только через регулярные промежутки времени (как правило, из задания cron ), поэтому некоторые файлы, возможно, еще не были проиндексированы во время вызова команды locate что приводит к менее точному результату. Вы можете принудительно создать или обновить эту базу данных, вызвав команду updatedb .

О find против исполнения ls ls будет сортировать вывод , который занимает много времени , пока вы не обязательно нужен. Кроме того, ls выведет много информации, которая впоследствии должна быть отфильтрована grep .

Ссылка:

3

Я всегда был фанатом находок, с этим можно многое сделать:

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" \)
2

Зависит от того, что вы хотите в результате. ls -R не скажет вам, в каком каталоге он нашел файл, а find найдет.

Кроме того, ls -R генерирует больше выходных данных, которые впоследствии фильтруются, в то время как find ищет именно то, что вы хотели. Без проведения измерений я бы предположил, что find как правило, более эффективен.

1

Вы также можете сопоставить файлы в.JPG и.JPEG заглавными буквами. С помощью find вы можете добавить -name '*.JPG' -name '*.JPEG' , или вы могли бы найти поиск по grep (да, это немного некрасиво):

find . -type f | grep "\.[Jj][Pp][Ee]\?[Gg]$"

Это будет соответствовать:

  • foo.jpg
  • bar.jpeg
  • Foo.JPG
  • бар.JPEG
1

find ./ -name *.jpg -print

1

Я обычно использую

      find . -name *.jpg -print {} \;
0

Найти, безусловно, лучший инструмент для этой работы.
Вывод ls -R будет трудно проанализировать (имена файлов чередуются с именами каталогов). Кроме того, с ls вам будет трудно иметь дело с именами с пробелами, пока вы найдете. -name '* .jpeg' -print0 создаст список, разделенный нулевыми символами. У xargs, grep и других есть возможность прочитать этот тип ввода. Это означает, что все странные имена сохраняются.

0

Помимо очевидной разницы с трубой, обе версии могут рассматриваться как равные. Реализация (ls.c против find.c, взятая из busybox) выглядит совершенно одинаково при поиске файлов. Вы также можете сократить первый:

ls -R *.jpeg
0

Установите "найти" или "локализовать"

Запустите "updatedb" и "locate \*. Jpeg"

updatedb создает базу данных индексов для имен файлов в вашей системе.

locate найдет файл из базы данных вместо сканирования каталога по каталогу.

Это быстрее, если вы делаете много поиска после каждой сборки базы данных. Возможно, вы захотите настроить задание cron для запуска команды updatedb.

Это похоже на Google Desktop Search, но только для поиска по имени файла.

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