Як використовувати команду “cat” на виході команди “find”?


13

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

Так, наприклад, якщо вихід знахідки, /aFile/readmeто кішку слід інтерпретувати як cat ./aFile/readme. Як я можу це зробити миттєво?

Чи потрібно використовувати труби?

Я спробував версії цього:

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

Але я гадаю, це абсолютно неправильно? Звичайно, я впевнений, що на виході є лише один файл, а не кілька файлів.

То як я можу це зробити? Я шукав в Google і не зміг знайти рішення, можливо, тому, що я не шукав правильно: P

Відповіді:


21

Це можна зробити findсамостійно, використовуючи -execдію:

find /location -size 1033c -exec 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опцію отримання номерів рядків.


Отже, якщо я маю рацію: {} - це як змінна, що в ній зберігається висновок команди find і після знаку "+" ви повинні написати параметри cat? Ні ? Редагувати: Добре, що ви відредагували своє повідомлення, і тепер ви просто відповіли на моє запитання: P Thanx man! Вирішено!
Eksapsy

@ general656 Перевір мої зміни ..
heemayl

1
Той факт , що я не знав про cat«S -nваріанти мене дивує. Я люблю читати випадкові запитання.
мазунки

1

Командна заміна

Інший варіант - використовувати командну заміну . Обгортання команди in $()запустить команду та замінить команду її результатом.

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)форми всі символи між дужками складають команду; ніхто не лікується спеціально.

Заміни команд можуть бути вкладені. Щоб укласти гніздо під час використання зворотної форми, уникайте внутрішніх зворотних котирувань із зворотними косами.

Якщо підміна з'являється в подвійних лапках, розбиття слів і розширення імені файлів на результатах не виконується.

Дивіться цю іншу відповідь на кілька хороших прикладів використання.


Зауважте, що якщо буде findзнайдено занадто багато файлів, це призведе до появи списку аргументів "занадто довгий" помилка, що намагається викликати cat. Також можуть виникнути проблеми з обробкою імен файлів, що містять символи пробілу, і, можливо, також файли, що містять символи глобулювання файлів.
Kusalananda

-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

Використовуйте трубу та решітки

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 для друку вмісту файлу в stdout. Тож цілі служить кіт. Питання полягає в тому, як використовувати cat з команди out put find для друку вмісту файлу, а не як використовувати sudo або find. Наведена вище команда вирішує питання. Так, xargs -0 була єдиною конструктивною річчю, яку ви вказали. Але не показали використання. Намагайтеся не бути грубими.
Робота з додатками

Вибачте, якщо це виявилося грубим. Це був не намір. Я хотів вказати на обмеження. Ваша відповідь показує погану практику ( find|xargsбез цього -0насправді забороняти), отже, голосування проти. Вихід findбез -print0не надійно обробляється. -print0не є стандартним. Сказавши це, стандарт sudo find / -name pg_hba.conf -exec cat {} +може також змусити вас скидати вміст /dev/urandom(наприклад, якщо хтось створив з нього симпосилання /tmp/pg_hba.confі немає простого портативного способу, що не має, принаймні, умови перегону).
Стефан Шазелас

1
Не будемо використовувати sudo"про всяк випадок", чи не так?
lindhe

Що ж, краще, ніж бігатиsudo rm -rf /
девінбост
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.