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

  • Grep каталог и возвращаемый список с номерами строк
  • Внутренний вызов функции с параметрами xargs
  • xargs и линейный трубопровод
  • Как повторять переменные дважды в xargs
  • xargs не генерирует правильную команду
  • xargs не запрашивает после каждой строки
  • Есть ли команда Unix для цитирования строк ввода?
  • Возможно ли, чтобы ls поддерживал порядок своих входов
  • вывод искажается при параллельном запуске «xargs ls»
  • Ни для чего ничего не нужно для xargs
  • Как проверить версию xargs?
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.