Linux: дерево -i -f -L $ глубина должна быть быстрее, чем найти -maxdepth $ глубину?

752
719016

Я запрашиваю определенные каталоги, чтобы увидеть, не нахожу ли я файлы с определенным шаблоном в них, и я пробовал это с двумя различными командами:

Стандартная findкоманда:

find -L $unix_dir\*/ -maxdepth $maxdepth -name \"$filepattern\" 

и treeи grepкоманда замены:

tree -L $maxdepth -l -i -f $unix_dir*/ | grep '$filepattern' 

Второй должен быть быстрее по какой-то причине? Я нахожу, что это иногда быстрее, но иногда так же быстро, как и другая команда, и я не уверен, в чем заключается теория обоих. Есть идеи?

5
Вы сначала пытаетесь выполнить команду `find`, а затем * немедленно * выполняете` tree | grep` команда? Если это так, структура каталогов, вероятно, кэшируется в памяти во время анализа `find`. Rain 11 лет назад 3

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

1
Alexey Ivanov

I'd say the second one is slower as it involves two processes tree and grep while the first one has only one process find.

Additionally, tree writes the names of all files it finds to its output stream which is then consumed by grep. At the same time, find prints only the names of matching files.

When using find, it tries to match only the file name to your specified $filepattern. In the second case, the pattern is applied to the full path of the file. Thus, the second case has more data to process.

 
On the other hand, the bottle neck in this test is disk IO. Both find and tree traverse the directories.
If you run each test one after another, the OS will cache the data about the directories and file names, therefore command will complete faster.

0
Zhen

Команда findзаписывает больше символов на экран, потому что она всегда записывает полный путь к файлу. Кроме того, сравнение с filepattern может быть более длинным в команде find (зависит от реализации). Например, с псевдокодом:

  • находить

    • Извлечь имя файла
    • Сравните имя файла с filepattern
  • дерево

    • Сравните имя файла с filepattern
Я ожидаю, что написание полного пути не является проблемой, потому что опции `tree`, которые я использую, одинаковы. 719016 11 лет назад 0

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