Как объединить файл в несколько файлов? - PullRequest
6 голосов
/ 07 августа 2020

Я хочу объединить text со всеми файлами в dir. Я использую for для выполнения этой работы, как в следующем коде. Я хочу знать, есть ли более сжатый код для того же?

for fn in dir/*; do
  cat text >> $fn
done

Ответы [ 3 ]

7 голосов
/ 07 августа 2020

Если text - имя файла, попробуйте:

tee -a dir/* <text >/dev/null

Если text на самом деле текст, который вы хотите добавить, то в bash:

tee -a dir/* <<<"text" >/dev/null

tee - это утилита, которая читает из стандартного ввода и записывает его в любое количество файлов в своей командной строке. Он также копирует стандартный ввод в стандартный вывод, поэтому выше используется >/dev/null. Параметр -a указывает tee добавлять, а не перезаписывать.

Вариант

Согласно предложению kvantour , может быть более понятным будет перенаправление для ввода в начале строки:

<text tee -a dir/* >/dev/null

(В приведенном выше примере text предполагается как имя файла)

4 голосов
/ 07 августа 2020

Есть проблемы с вашим кодом:

  • Если файлов в dir не существует, вы напишете text в файл с именем * буквально.
  • $fn расширение без кавычек!

Я бы сказал:

find dir -maxdepth 1 -type f -exec sh -c 'cat text >> "$1"' _ {} \;

что я не думаю, что это более лаконично.

3 голосов
/ 07 августа 2020

Вы можете сделать их все кратко и параллельно с GNU Parallel :

parallel 'cat text >>' ::: dir/*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...