Как я могу напечатать содержимое вместо имени файла с помощью команды linux find?

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|;

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

Rezuan
источник
Вам все еще нужно использовать cat.
Игнасио Васкес-Абрамс
Да! Подскажите, пожалуйста, как я могу это сделать? @ IgnacioVazquez-Abrams
Резуан

Ответы:

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 {} +. Кстати, спасибо, Ярон.
Резуан
xargs уязвим к пробелам в найденных путях; -exec cat {} нет
Jez
2
find -print0 | xargs -0не уязвим для пробелов / кавычек / и т.д.
пушистый
1
@Rezuan: -exec cat {} \;запускает cat отдельно для каждого файла, вместо того, чтобы связывать их вместе, как xargs. Не используйте его, если вы явно не хотите этого (например, команда, которая работает только для одного файла за раз), или если вам нужна переносимость в систему без -exec ... +и без -print0/ xargs -0. Я немного удивлен, что find|xargsэто заметно медленнее, чем -exec cat {} +, однако. У вас очень мало файлов, поэтому затраты на запуск очень высоки? Или вы только время xargsверсии, когда ваш дисковый кэш был холодным?
Питер Кордес
1
@PeterCordes спасибо за объяснение. Это было для дискового кэша, я понял позже.
Резуан