Я делаю, find
а затем получаю список файлов. Как передать это другой утилите cat
( например, чтобы cat отображал содержимое всех этих файлов), и в основном нужно grep
что-то из этих файлов.
Трубопровод к другому процессу (хотя это НЕ ПОЛУЧИТ то, что вы сказали, что пытаетесь сделать):
command1 | command2
Это отправит вывод command1 как ввод command2
-exec
на find
(это будет делать то, что вы хотите сделать, - но конкретно find
)
find . -name '*.foo' -exec cat {} \;
(Все, что находится между find
и -exec
являются предикатами поиска, которые вы уже использовали. {}
Будет заменять конкретный файл, который вы нашли в команде ( cat {}
в данном случае); команда \;
должна завершать -exec
команду.)
отправлять вывод одного процесса в качестве аргументов командной строки другому процессу
command2 `command1`
например:
cat `find . -name '*.foo' -print`
(Обратите внимание, что это ЗАДНИЕ ЦИТАТЫ, а не обычные кавычки (под тильдой ~ на моей клавиатуре).) Это отправит вывод command1
в command2
виде аргументов командной строки. Обратите внимание, что имена файлов, содержащие пробелы (новые строки и т. Д.), Будут разбиты на отдельные аргументы.
find -name '*.foo' -print
отлично сработал для меня ... Спасибоfind
позволяют писать:,find . -name '*.foo' -exec cat {} +
где+
указывает, чтоfind
следует объединить столько имен файлов, сколько это удобно, в один вызов команды. Это очень полезно (оно работает с пробелами и т. Д. В именах файлов, не прибегая к-print0
иxargs -0
).find . -name '*.foo' | xargs cat
find . -name '*.foo' | xargs cat | grep string
Современная версия
POSIX 2008 добавил
+
маркер,find
который означает, что теперь он автоматически группирует столько файлов, сколько разумно, в одно выполнение команды, очень похоже на то, чтоxargs
делает, но с рядом преимуществ:Проблема с именем файла - это проблема
xargs
без-0
опции, а проблема «даже с нулевыми именами файлов» - это проблема с или без-0
опции, но GNUxargs
имеет опцию-r
или,--no-run-if-empty
чтобы предотвратить это. Кроме того, эта запись сокращает количество процессов, а не то, что вы, скорее всего, будете измерять разницу в производительности. Следовательно, вы могли бы разумно написать:Классическая версия
Если вы находитесь на Linux или имеют GNU
find
иxargs
команды, а затем использовать-print0
сfind
и-0
сxargs
к именам файлов ручки , содержащими пробелы и другие символы нечетным мяч.Настройка результатов от
grep
Если вам не нужны имена файлов (только текст), добавьте соответствующую опцию
grep
(обычно-h
для подавления «заголовков»). Чтобы гарантировать абсолютную гарантию того, что имя файла напечатано с помощьюgrep
(даже если найден только один файл или для последнего вызоваgrep
задано только 1 имя файла), добавьте/dev/null
вxargs
командную строку, чтобы всегда было как минимум два имени файла.источник
xargs grep something
.find
передается на стандартный вводxargs
.xargs
Программа считывает стандартный ввод, разделяя вход в пустое пространство (пробелы, новые строки, вкладки и т.д.) и добавляет число слов в командуgrep something
и выполняет командную строку.xargs
затем продолжает чтение ввода и выполнение команд, пока не закончится ввод.xargs
запускаетgrep
команду так часто, как это необходимо для вводимого ею ввода (изfind
этого примера)./dev/null
теряет сообщения об ошибках.Есть несколько способов передать список файлов, возвращаемых
find
командойcat
команде, хотя технически не все используют конвейерную связь, и ни один из них на самом деле не направляется напрямуюcat
.Самое простое - использовать backticks (
`
):Это берет вывод
find
и эффективно помещает его в командную строкуcat
. Это не работает, еслиfind
выводится слишком много (больше, чем может поместиться в командной строке) или если вывод содержит специальные символы (например, пробелы).В некоторых оболочках, в том числе
bash
, можно использовать$()
вместо обратных галочек:Это менее переносимо, но является вложенным. Помимо этого, он имеет почти те же предостережения, что и кавычки.
Поскольку выполнение других команд для того, что было найдено, является общеупотребительным
find
, find находит-exec
действие, которое выполняет команду для каждого найденного файла:{}
Является заполнителем для имени файла, и\;
помечает конец команды (возможно , чтобы другие действия после-exec
.)Это будет выполнено
cat
один раз для каждого отдельного файла, а не для запуска одного экземпляра сcat
передачей ему нескольких имен файлов, что может быть неэффективно и может не соответствовать желаемому поведению некоторых команд (хотя это хорошо дляcat
). Синтаксис также неудобен для ввода - вам нужно избегать точки с запятой, потому что точка с запятой является особенной для оболочки!Некоторые версии
find
( в первую очередь в версии GNU) позволяют заменить;
с+
для использования-exec
« в режиме S дописывания для запуска меньше случаевcat
:Это передаст несколько имен файлов для каждого вызова
cat
, что может быть более эффективным.Обратите внимание, что это не гарантирует использование одного вызова, однако. Если командная строка будет слишком длинной, то аргументы будут распределены по нескольким вызовам
cat
. Посколькуcat
это, вероятно, не имеет большого значения, но для некоторых других команд это может изменить поведение нежелательными способами. В системах Linux ограничение длины командной строки довольно велико, поэтому разбиение на несколько вызовов довольно редко по сравнению с некоторыми другими операционными системами.Классический / портативный подход заключается в использовании
xargs
:xargs
запускает указанную команду (cat
в данном случае) и добавляет аргументы на основе того, что она читает из стандартного ввода. Точно так же как-exec
с+
, это сломает командную строку при необходимости. То есть, еслиfind
выдает слишком много вывода, он будет работатьcat
несколько раз. Как уже упоминалось в-exec
предыдущем разделе , есть некоторые команды, в которых это разделение может привести к разному поведению. Обратите внимание, что при использованииxargs
подобного способа возникают проблемы с пробелами в именах файлов, посколькуxargs
в качестве разделителя используется только пробел.Самый надежный, портативный и эффективный метод также использует
xargs
:-print0
Флаг указываетfind
использовать\0
(нулевой символ) разделители между именами файлов и-0
флаг указываетxargs
ожидать эти\0
разделители. Это поведение в значительной степени идентично поведению-exec
...+
, хотя и более переносимо (но, к сожалению, более многословно).источник
ls
.$()
Также работает с командами, кромеfind
.Для этого (используя bash) я бы сделал следующее:
Это называется «подстановка команд» и по умолчанию удаляет перевод строки, что очень удобно!
больше информации здесь
источник
Похоже, работа для сценария оболочки для меня:
или что-то вроде того
источник
Вот мой способ найти имена файлов, которые содержат интересующий меня контент, всего лишь одну строку bash, которая также хорошо обрабатывает пробелы в именах файлов:
источник
Я использую что-то вроде этого:
-print0
Аргумент " " для "find" и "-0
" аргумент для "xargs" необходимы для правильной обработки пробелов в путях / именах файлов.источник
Команда find имеет аргумент -exec, который вы можете использовать для таких вещей, вы можете просто использовать grep, используя это.
Например ( отсюда, другие хорошие примеры на этой странице ):
источник
Вот мой снимок для общего пользования:
Будет напечатано имя файла
источник
В bash было бы целесообразно следующее:
Это найдет все файлы в
/dir
каталоге и безопасноxargs
передаст имена файлов , которые будут безопасно вестиgrep
.Пропуск
xargs
не очень хорошая идея, если у вас есть много тысяч файлов/dir
;cat
сломается из-за чрезмерной длины списка аргументов.xargs
разберусь с этим.-print0
Аргументfind
сеток с-0
аргументомxargs
для обработки имен файлов с пробелами правильно.-i
Аргументxargs
позволяет вставить имя файла , где это необходимо вcat
командной строке. Скобки заменяются именем файла, переданным вcat
команду fromfind
.источник
Это работает для меня
источник
Используйте ggrep .
искать файл в unix, содержащий текст, расположенный в текущем каталоге или подкаталоге
источник
Это напечатает имя и содержимое файлов только рекурсивно.
Редактировать (улучшенная версия): будет рекурсивно печатать имя и содержимое текстовых (ascii) файлов.
Еще одна попытка
источник
Вы пытаетесь найти текст в файлах? Вы можете просто использовать grep для этого ...
источник
Для просмотра и просмотра содержимого всех файлов abc.def на сервере в каталогах / ghi и / jkl
Чтобы просмотреть список файлов abc.def с комментариями и отображением, смотрите эти записи в каталогах / ghi и / jkl
источник