используйте команду tee для перенаправления вывода в файл в несуществующем каталоге

Я пытаюсь использовать команду tee для перенаправления вывода в файл, и я хочу, чтобы файл был создан в каталоге, который еще не создан.

date | tee new_dir/new_file

когда new_dir не существует, команда tee

tee: new_dir/new_file: нет такого файла или каталога

Если я создаю new_dir перед запуском команды tee, то он отлично работает, но по какой-то причине я не хочу создавать new_dir вручную, возможно ли создать new_dir с помощью команды tee?

8
nl ja de

4 ответы

Нет. Вам нужно будет создать каталог перед запуском tee .

13
добавлено
Каталог уже существует в моем случае, но tee жалуется, что файл не существует, если я не использую флаг -a с tee.
добавлено автор Alexander Mills, источник

Замените tee на функцию, которая создает для вас каталог:

tee() { mkdir -p ${1%/*} && command tee "[email protected]"; }

Если вы хотите, чтобы функция работала при вызове с простым именем файла:

tee() { if test "$1" != "${1%/*}"; then mkdir -p ${1%/*}; fi &&
   command tee "$1"; }
2
добавлено
Если требуется надежность, можно, конечно, добавить чек ...
добавлено автор William Pursell, источник
tee foo.txt => mkdir -p foo.txt && command tee "foo.txt" Я не думаю, что это совершенно правильно ...
добавлено автор twalberg, источник
mkdir ./new_dir && date | tee ./new_dir/new_file

Since it is tee command, it simultaneously writes both to the new_file and to stdout

1
добавлено

Хм ... После некоторых экспериментов я нашел интересные вещи.

Прежде всего, давайте попробуем коснуться некоторого файла:

touch ~/.lein/profiles.clj

Он работает нормально. Но давайте использовать то же самое с кавычками:

touch "~/.lein/profiles.clj" # => touch: cannot touch ‘~/.lein/profiles.clj’: No such file or directory

Итак, для моей функции bash:

append_to_file() {
  echo $2 | tee -a $1
}

после этого я изменил звонок от него:

append_to_file '~/.lein/projects.clj' '{:user {:plugins [[lein-exec "0.3.1"]]}}'

к нему (первый аргумент без кавычек):

append_to_file ~/.lein/projects.clj '{:users {:plugins [[lein-exec "0.3.1"]]}}'

И все хорошо.

ОБНОВИТЬ

Этот случай рассматривает .lein как существующий каталог.

0
добавлено
touch "~/.lein/profiles.clj" не работает, потому что двойные кавычки блокируют расширение тильды.
добавлено автор twalberg, источник
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru