Как использовать команду «cat» на выходе команды «find»?

13

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

Так, например, если результат поиска - это /aFile/readmeто, кот должен интерпретироваться как cat ./aFile/readme. Как я могу сделать это мгновенно?

Должен ли я использовать трубы?

Я попробовал версии этого:

cat | find ./inhere -size 1033c 2> /dev/null

Но я полагаю, это совершенно неправильно? Конечно, я уверен, что на выходе будет только один файл, а не несколько файлов.

Так как я могу это сделать? Я искал в Google и не мог найти решение, вероятно, потому что я не правильно искал: P

Eksapsy
источник

Ответы:

21

Вы можете сделать это в findодиночку, используя -execдействие:

find /location -size 1033c -exec cat {} +

{}будет расширен до найденных файлов и +позволит нам прочитать как можно больше аргументов за вызов cat, так как cat может принимать несколько аргументов.

Если у вас findнет +расширения или вы хотите читать файлы один за другим:

find /location -size 1033c -exec cat {} \;

Если вы хотите использовать какие-либо параметры cat, выполните:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Здесь я использую -nопцию, чтобы получить номера строк.

heemayl
источник
Итак, если я прав: {} похожа на переменную, в которой хранятся выходные данные команды find и после знака «+» вы должны записывать параметры cat? Нет? Изменить: Хорошо, вы отредактировали свой пост, и теперь вы только что ответили на мой вопрос: P Thanx man! Решено!
Eksapsy
@ general656 Проверьте мои правки ..
Heemayl
1
Тот факт , что я не знал о cat«S -nварианта меня удивляет. Я люблю читать случайные вопросы.
мазунки
0

Подстановка команд

Другой вариант - использовать подстановку команд . Перенос команды в $()запустит команду и заменит команду ее выводом.

cat $(find ./inhere -size 1033c 2> /dev/null)

станет

cat ./inhere/file1 .inhere/file3

Это более или менее эквивалентно использованию более старого стиля переноса команд с обратными галочками:

cat `find ./inhere -size 1033c 2> /dev/null`

Более подробная информация из документов, связанных выше

Bash выполняет расширение, выполняя команду в среде подоболочек и заменяя подстановку команды стандартным выводом команды, удаляя все завершающие символы новой строки. Введенные новые строки не удаляются, но они могут быть удалены во время разделения слов. Подстановка команд $(cat file)может быть заменена эквивалентной, но более быстрой $(< file).

Когда старый стиль форма кавычки замещения используются, обратный слеш сохраняет свое буквальное значение , за исключением , когда следует $, `или \. Первая обратная кавычка, которой не предшествует обратная косая черта, завершает подстановку команды. При использовании $(command)формы все символы в скобках составляют команду; никто не лечится специально.

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

Если подстановка встречается в двойных кавычках, разделение слов и расширение имени файла не выполняются.

Посмотрите этот другой ответ для некоторых хороших примеров использования.

WhiteHotLoveTiger
источник
Обратите внимание, что если findнаходит слишком много файлов, это приведет к ошибке «список аргументов слишком длинный» при попытке вызова cat. Также могут возникнуть проблемы с обработкой имен файлов, содержащих пробельные символы, и, возможно, также имен файлов, содержащих символы-заглушки.
Кусалананда
-1

Это напечатает имя и содержимое текстовых (ascii) файлов только для рекурсии.

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Еще одна попытка

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
Прашант Адлинге
источник
-2

Используйте трубу и Xargs

find /* -name pg_hba.conf | xargs cat

Если произойдет сбой из-за отсутствия разрешений, вы можете использовать sudo, чтобы убедиться, что у вас есть разрешение на выполнение команды поиска в каталоге, который вы ищете.

 sudo find /* -name pg_hba.conf | xargs sudo cat
Приложение Работа
источник
1
И если кто-то создал файл с именем /tmp/ /dev/urandom /pg_hba.conf, это позволит root выгружать все содержимое /dev/urandom. Хуже, вероятно, может быть сделано в зависимости от контекста. xargsпочти никогда не должен использоваться без, -0если вообще. И sudo xargsбыло бы лучше, чем xargs sudo. И /*было бы лучше как /.
Стефан
1
ОП хочет использовать cat для вывода содержимого файла на стандартный вывод. Таким образом, цель обслуживается кошкой. Вопрос в том, как использовать команду cat из команды out put of find для вывода содержимого файла, а не в том, как использовать sudo или find. Команда выше решает вопрос. Да, xargs -0 была единственной конструктивной вещью, которую вы указали. Но не показал использование. Постарайтесь не быть грубым.
App Work
Извините, если это показалось грубым. Это не было намерением. Я хотел указать на ограничения. Ваш ответ показывает плохую практику ( find|xargsбез -0должен быть действительно запрещен), следовательно, голосование против. Выход findбез -print0постобработки надежно. -print0не является стандартным Сказав это, стандарт sudo find / -name pg_hba.conf -exec cat {} +также может заставить вас сбросить содержимое /dev/urandom(например, если кто-то создал символическую ссылку /tmp/pg_hba.confна него, и нет простого переносимого пути, который, по крайней мере, не имеет состояния гонки).
Стефан
1
Давайте не будем использовать sudo«на всякий случай», не так ли?
Линде
Ну, это лучше, чем бегsudo rm -rf /
devinbost