Как определить, делают ли разные команды, использующие grep, find и xargs, одно и то же?

Как определить, делают ли разные команды, использующие grep, find и xargs, одно и то же?

Делают ли эти три команды одно и то же?

  • Команда, использующая grep.

    grep "a" -r .
    
  • Команда, использующая find.

    find .  -exec grep "a" {} \;
    
  • Команда, которая использует grep для поиска через xargs.

    find . | xargs grep "a"
    

решение1

Они не одинаковы, и у каждого есть свои проблемы.

  • Первый непереносимый, так как использует расширение Gnu. Более того, ожидается, что опции будут перед шаблоном, а не после него.
  • Во втором случае имя файла не отображается, как уже было сказано.
  • Третий вариант не сработает, если в именах файлов есть пробелы или что-то подобное.

Вместо этого я бы использовал:

find .  -type f -exec grep a /dev/null {} +

Он портативен, игнорирует необычные файлы, не конфликтует со странными именами файлов и всегда отображает имена файлов, если найден шаблон.

решение2

Это вопрос домашнего задания?

Вы их пробовали?

Они делают немного разные вещи.

Например, если вы передаете grepодно имя файла, то оно не будет отображаться на выходе. Это может раздражать при использовании grepс find.

решение3

Вам следует лучше определить "делать то же самое". Первый вариант запускает одну команду, второй запускает одну команду find и fork+exec grep один раз на каждый найденный файл, а третий запускает минимум три команды - или больше, если найдено слишком много файлов, чтобы поместиться в одну командную строку. Что касается влияния на процессор/память, они наиболее отчетливо делаютнетсделайте то же самое — разница между 1, 3 и «целой кучей» процессов существенна.

С точки зрения файловой системы, файловая система проходит, каждый файл stat'ится, а затем открывается, полностью считывается и закрывается. Так что с этой точки зрения они все делают одно и то же, и файловая система не замечает разницы (кроме, возможно, более медленного прохождения во втором случае из-за накладных расходов от разветвления миллиарда процессов).

Вывод на экран отличается, и эту разницу можно определить эмпирически, просто выполнив команды с несколькими различными возможными структурами каталогов (один из очевидных способов — тот, который упомянул redgrittybrick).

На их ввод уходит разное количество времени из-за количества различных символов и вероятности синтаксических ошибок.

И так далее. Есть много способов, которыми вещи могут «отличаться». :)

Связанный контент