Как я могу создать файл, который я получил из stdin без xargs

Чтобы лучше изучить оболочку и без необходимости прибегать к xargs, я пытался найти другие способы:

find . -name *.tcl | xargs -I{} cat {} 

xargs заставляют его чувствовать себя грязным, и я хотел бы знать, есть ли у него несколько способов сделать это.

EDIT: Я обнаружил, что другое решение должно использовать:

 find . -name "*.tcl" | cat `cat /dev/stdin` 

Я не понимаю, почему я должен cat имя файла, прежде чем кошка увидит его как файл, а не строку, хотя ….

5 Solutions collect form web for “Как я могу создать файл, который я получил из stdin без xargs”

Вы также можете использовать find в подпроцессе и подавать вывод на cat 🙂

 cat $(find . -name "*.tcl") 

Вы можете использовать exec в поиске:

 find . -name "*.tcl" -exec cat {} \; 

Все между -exec и trailing \; это команда для запуска. Как и xargs, вы заменяете результаты поиска на {}. Для каждого найденного файла cat запускается (подобно тому, как xargs выполняет итерацию по списку файлов, передаваемых через STDIN.

Некоторые могут утверждать, что это более эффективно, поскольку вы не используете трубку или не запускаете другое приложение.

Если вы используете bash , просто:

 shopt -s globstar # to match files recursively cat -- **/*.tcl 

Вы можете запустить команду для каждой строки ввода с циклом while и встроенной командой оболочки:

 find . -name '*.tcl' | while IFS= read -r filename; do cat "$filename"; done 

Для простоты моим предпочтением было бы чистое и понятное решение, уже поставленное Марком Комаринским . Однако в Bash есть много способов сделать это. Еще один интересный способ – избежать cat целом и воспользоваться переадресацией:

 find . -name '*.tcl' -exec sh -c 'printf "%s\n" "$(< {})' \;; 

Фактически, если вы хотите выполнить всю задачу исключительно с помощью встроенных модулей Bash, вы можете комбинировать использование перенаправления с решением glob, созданным хаосом :

 shopt_globstar_temp="$(shopt -p globstar)"; shopt -s globstar; for filename in **/*.bat; do printf "%s" "$(< "${filename}")"; done; ${shopt_globstar_temp}; 

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


Я не понимаю, почему я должен cat имя файла, прежде чем кошка увидит его как файл, а не строку, хотя ….

Результат cat /dev/fd/stdin будет таким же, как вывод find в вашем последнем примере, поэтому он будет эффективно заменен на <filename1>.tcl <filename2>.tcl ... и cat использует этот список файлов как его список аргументов.

Если вам интересно, почему в этом же примере у вас есть cat stdin , причина в том, что не все программы относятся к stdin же, как к аргументам. Если данные передаются в cat через stdin тогда cat будет просто выводить эти же данные вместо того, чтобы интерпретировать его как имя файла, которое нужно прочитать.

  • копирование нескольких файлов в несколько каталогов
  • xargs не генерирует правильную команду
  • GNU parallel vs & (я имею в виду фон) vs xargs -P
  • Как получить код выхода параллельного процесса, запущенного xargs?
  • Предоставление параметров scp с помощью xargs
  • cp после того, как xargs не работает
  • Массовое переименование файлов на камкордерах, включая пробелы
  • Пропустить флаги для xargs
  • Почему эта команда xargs не работает?
  • Удаление номеров из имен файлов
  • Сколько способов конвертировать и передавать stdin в качестве параметра команды?
  • Interesting Posts

    Не может ssh на мой сервер из домашнего linux, но может ssh на тот же сервер из окон

    Установите цвет по умолчанию для верхнего

    Обновление ядра Linux, оставляя остальную систему как

    Почему у меня GRUB и GRUB2 в моем загрузочном каталоге?

    изменения rhosts и повторная инициализация

    Как распределять файлы / пакеты / программное обеспечение на нескольких дисках?

    Как сохранить время на сервере (виртуальной машине) с течением времени?

    Что делает опция escape-последовательности xterm и как ее включить?

    Ограничение системных библиотек, которые программа может использовать

    Использует env и экспортирует то же самое?

    Что означает опция –color = auto для GNU grep?

    Не удается войти через SSH с новым пользователем (подключение к 10.0.2.142 закрыто).

    Отключить поведение копирования и вставки по умолчанию в Bash

    Сила systemd для проверки состояния службы через n секунд

    cp говорит «тот же файл» для двух разных каталогов

    Linux и Unix - лучшая ОС в мире.