Не совсем понятно, что вы намерены делать с вашей командой, поэтому эти замечания являются немного обобщенными.
Если вы хотите Grep большое количество файлов для слова foo
, к примеру, тогда вы могли бы сделать что-то вроде
find . -type f -name \*.ext | xargs grep foo
Важным моментом здесь является то, что \*
передается find
для него для расширения, и это не расширена оболочкой. Ошибка «Список аргументов слишком длинная», вероятно, является результатом оболочки , расширяя ваш "*.ext"
и пытаясь передать этот длинный список в виде множества аргументов для поиска. Это может быть ключевым, что вам не хватает в ваших экспериментах.
Способ, которым работает xargs
, заключается в том, что он считывает аргументы из stdin (в этом случае список файлов, созданных find
), и повторно вызывает данную функцию с таким количеством аргументов, которое будет соответствовать. Если строки, отправленные на xargs
, совершенно необычны, вы должны посмотреть опцию -0
для xargs
.
Другой способ использования найти, что более естественно в некоторых обстоятельствах,
find . -type f <whatever> | while read f; do some-command $f; done
Здесь while
снова читает строки по одному, назначая их, в свою очередь f
, которые обрабатываются один за другим время в цикле.
Можете ли вы показать нам, что вы пробовали с помощью 'xargs'? – larsks
Очевидным вопросом будет то, насколько велик ваш список - если вы отрубите только первые 10 строк, это сработает, или что-то не так с идеей как в концепции, так и в количестве? Кроме того, вы можете попробовать перед командной строкой с помощью 'echo' отсортировать вывод« что это может сделать ». –
Список имеет более 1M строк – biggthed