Как передать список файлов, возвращенных командой find в cat для просмотра всех файлов



Я делаю find а затем получение списка файлов. Как мне передать его в другую утилиту, например cat (Так что cat отображает содержимое всех этих файлов) и в основном нужно grep что-то из этих файлов.

681   14  

14 ответов:

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

    command1 | command2
    

    это отправит выходные данные command1 в качестве входных данных command2

  2. -exec на find (этот будет делать то, что вы хотите сделать, но относящиеся к find)

    find . -name '*.foo' -exec cat {} \;
    

    (между find и -exec найти предикаты, которые вы уже использовали. {} заменить конкретный файл, который вы нашли в команде (cat {} в данном случае); the \; конец .)

  3. отправить выход из одного процесса в качестве аргументов командной строки в другой процесс

    command2 `command1`
    

    например:

    cat `find . -name '*.foo' -print`
    

    (обратите внимание, что это обратные кавычки, а не обычные кавычки (под Тильдой ~ на моей клавиатуре).) Это отправит вывод command1 на command2 в качестве аргументов командной строки. Обратите внимание, что имена файлов, содержащие однако пробелы (новые строки и т. д.) будут разбиты на отдельные аргументы.

find . -print | xargs grep something

если вы на Linux или у вас есть GNU find и xargs, а затем использовать -print0 С find и -0 С xargs для обработки имен файлов, содержащих пробелы и другие нечетные символы.

если вы не хотите имена файлов-только текст - то добавьте соответствующую опцию в grep (обычно -h справочник 'заголовки'). Чтобы абсолютно гарантировать, что имя файла печатается с помощью grep (даже если найден только один файл или последний вызов grep дается только 1 имя файла), затем добавить /dev/null до xargs командная строка, так что всегда будет по крайней мере два имени файла.


обратите внимание, что POSIX 2008 добавил + маркер find что означает, что теперь он автоматически группирует столько файлов, сколько разумно в одно выполнение команды, очень похоже на xargs делает, но с рядом преимуществ:

  1. вам не нужно беспокоиться о нечетных символах в файле имена.
  2. вам не нужно беспокоиться о том, что команда вызывается с нулевыми именами файлов.

обе эти проблемы с xargs без . Следовательно, вы могли бы разумно написать:

find . -exec grep something {} +

есть несколько способов передать список файлов, возвращенных до cat команда, хотя технически не все используют трубопроводы, и ни один на самом деле трубы непосредственно к cat.

  1. самый простой способ-это использовать обратные кавычки (`):

    cat `find [whatever]`
    

    это принимает выход find и эффективно помещает его в командной строке cat. Это не работает хорошо, если find слишком много выходных (больше, чем может поместиться в командной строке) или если на выходе есть специальные символы (например, пробелы).

  2. в некоторых оболочках, в том числе bash можно использовать $() вместо обратные кавычки :

    cat $(find [whatever])
    

    это менее портативно, но нестабильно. Кроме того, он имеет почти те же предостережения, что и backticks.

  3. потому что выполнение других команд на том, что было найдено, является общим использованием для find, имеет -exec действие, которое выполняет команду для каждого файла это находки:

    find [whatever] -exec cat {} \;
    

    The {} является заполнителем для имени файла, а \; отмечает конец команды (после .)

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

  4. некоторые версии find (особенно версия GNU) позволяет заменить ; С + использовать -exec режим добавления для запуска меньшего количества экземпляров cat:

    find [whatever] -exec cat {} +
    

    это передаст несколько имен файлов для каждого вызова cat, который может быть более эффективным.

    обратите внимание, что это не гарантированно использовать один вызов, однако. Если командная строка будет слишком длинной, то аргументы будут распределены по нескольким вызовам cat. Ибо cat это, вероятно, не имеет большого значения, но для некоторых других команд это может изменить поведение нежелательным образом. В системах Linux ограничение длины командной строки довольно велико, поэтому разбиение на несколько вызовов довольно редко по сравнению с некоторыми другими ОС.

  5. классический/портативный подход заключается в использовании xargs:

    find [whatever] | xargs cat
    

    xargs выполняет указанную команду (cat в данном случае), и добавляет аргументы, основанные на том, что он читает из stdin. Так же, как -exec С +, при необходимости это приведет к разрыву командной строки. То есть, если find производит слишком много вывода, он будет работать cat несколько раз. Как уже упоминалось в разделе о -exec ранее, есть некоторые команды, где это разделение может привести к различному поведению. Обратите внимание, что с помощью xargs как это проблемы с пробелами в именах файлов, как xargs просто использует пробелы в качестве разделителя.

  6. самый надежный, портативный и эффективный метод также использует xargs:

    find [whatever] -print0 | xargs -0 cat
    

    The -print0 флаг говорит find использовать (нулевой символ) разделители между именами и -0 флаг говорит xargs ожидать, что эти разделители. Это имеет в значительной степени идентичное поведение -exec...+ подход, хотя и более портативный (но, к сожалению, более подробно).

для достижения этого (с помощью bash) я бы сделал следующее:

cat $(find . -name '*.foo')

Это известно как" подстановка команд", и по умолчанию он удаляет подачу строки, что действительно удобно !

более подробная информация здесь

звучит как работа для сценария оболочки для меня:

for file in 'find -name *.xml'
do
   grep 'hello' file
done

или что-то подобное

вот мой способ найти имена файлов, которые содержат некоторый контент, который меня интересует, просто одна строка bash, которая также хорошо обрабатывает пробелы в именах файлов:

find . -name \*.xml | while read i; do grep '<?xml' "$i" >/dev/null; [ $? == 0 ] && echo $i; done

Я использую что-то вроде этого:

find . -name <filename> -print0 | xargs -0 cat | grep <word2search4>

"-print0" аргумент "найти" и "-0" аргумент для "xargs" необходим для правильной обработки пробелов в путях/именах файлов.

команда find имеет аргумент-exec, который вы можете использовать для таких вещей, вы можете просто сделать grep напрямую, используя это.

например (отсюда, другие хорошие примеры на эту страницу):

find . -exec grep "www.athabasca" '{}' \; -print 

вот мой выстрел для общего пользования:

grep YOURSTRING `find .`

Он будет печатать имя файла

в bash было бы уместно следующее:

find /dir -type f -print0 | xargs -0i cat {} | grep whatever

это позволит найти все файлы в /dir каталог, и безопасно передавать имена файлов в xargs, который будет безопасно управлять grep.

пропуск xargs не очень хорошая идея, если у вас есть много тысяч файлов в /dir;cat сломается из-за чрезмерной длины списка аргументов. xargs разберется, что все для вас.

The до find сетки с до xargs для правильной обработки имен файлов с пробелами. Элемент до xargs позволяет вставить имя файла, где это необходимо в cat командная строка. Скобки заменяются именем файла, передаваемым в С find.

это работает для меня

find _CACHE_* | while read line; do
    cat "$line" | grep "something"
done

использовать ggrep.

ggrep -H -R -I "mysearchstring" *

для поиска файла в unix, содержащего текст, расположенный в текущем каталоге или подкаталоге

вы пытаетесь найти текст в файлах? Вы можете просто использовать grep для этого...

grep searchterm *

чтобы перечислить и посмотреть содержимое всех abc.def файлы на сервере в каталогах /ghi и / jkl

find /ghi /jkl -type f -name abc.def 2> /dev/null -exec ls {} \; -exec cat {} \;

чтобы перечислить abc.def файлы, которые прокомментировали записи и отображения см. Эти записи в каталогах /ghi и /jkl

find /ghi /jkl -type f -name abc.def 2> /dev/null -exec grep -H ^# {} \;

Comments

    Ничего не найдено.