Як я можу надрукувати вміст замість імені файлу за допомогою команди пошуку Linux?


10

У мене є тисячі файлів unl, названих приблизно так cbs_cdr_vou_20180624_603_126_239457.unl. Я хотів надрукувати всі рядки з цих файлів за допомогою наступної команди. але це дає мені лише імена файлів. Мені файли мені не потрібні, мені просто потрібен вміст із цих файлів.

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt

Поточний вихід:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl

Очікуваний вихід:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;

Зауважте, що для котячих команд я отримую помилку -bash: /bin/logger: Argument list too long, тому я хотів використовувати findзамість catкоманди.


Ще потрібно користуватися cat.
Ігнасіо Васкес-Абрамс

Так! Скажіть, будь ласка, як я можу це зробити? @ IgnacioVazquez-Abrams
Rezuan

Відповіді:


28

findУтиліта займається дорожніми іменами. Якщо в findкоманді не знайдено жодної конкретної дії для знайдених імен шляхів, дію за замовчуванням полягає у їх виведенні.

Ви можете виконати дію з знайденими іменами шляхів, наприклад, запуском cat, додавши -execдо findкоманди:

find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

Це знайде всі звичайні файли в поточному каталозі або під ним, імена якого відповідають заданому шаблону. Для якомога більшої кількості цих пакетів catбуде закликано об'єднати вміст файлів.

Вихід піде на /home/fifa/cbs/test.txt.

Пов'язані:


1
Робота, як очікувалося, та час виконання дуже швидка, що справді чудово. Дуже дякую.
Резуан

12

Результатом findбуде результат відповідних імен файлів.
Ви можете |передавати ( ) вихід, до xargs catякого буде виконуватися catкоманда для кожного файлу.

наприклад:

find -type f -name 'cbs_cdr_vou_20180615*.unl' | xargs cat  > /home/fifa/cbs/test.txt

Ще одним варіантом буде використання -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt

4
Обидві ваші команди працюють чудово. Але трохи повільніше, ніж командування Кусалаланда . Я думаю, час виконання залежить від -exec cat {} \;та -exec -cat {} +. До речі, спасибі велике Яроне.
Rezuan

xargs вразливий до просторів у знайдених іменах шляхів; -exec cat {} немає
яз

2
find -print0 | xargs -0не вразливий до пробілів / цитат / тощо.
пухнастий

1
@Rezuan: -exec cat {} \;запускає кота окремо для кожного файлу, а не збирає їх разом, як xargs. Не використовуйте його, якщо ви прямо не хочете цього (наприклад, команда, яка працює лише для одного файлу за один раз) або якщо вам потрібна портативність до системи без -exec ... +і без -print0/ xargs -0. Я трохи здивований, що find|xargsце помірно повільніше, ніж -exec cat {} +, однак. У вас дуже мало загальних файлів, тож накладні накладні витрати - це велика вартість? Або ви лише працювали над xargsверсією, поки кеш диска був холодним?
Пітер Кордес

1
@PeterCordes дякую за пояснення. Це було для кеш-диска, я зрозумів згодом.
Резуан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.