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

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

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

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

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

Я пробовал следующие версии:

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

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

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

решение1

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

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

{}будут заменены файлами, найденными find, и +позволят нам прочитать столько аргументов, сколько возможно за один вызов 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опцию получения номеров строк.

решение2

Замена команды

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

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

станет

cat ./inhere/file1 ./inhere/file2 ./inhere/file3

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

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

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

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

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

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

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

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

решение3

Это позволит рекурсивно вывести имя и содержимое текстовых (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 {} \;

решение4

Используйте pipe и xargs

find /* -name pg_hba.conf | xargs cat

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

 sudo find /* -name pg_hba.conf | xargs sudo cat

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