Пакет moreutils имеет команду sponge
:
sponge reads standard input and writes it out to the specified file.
Unlike a shell redirect, sponge soaks up all its input before opening
the output file. This allows constricting pipelines that read from and
write to the same file.
с тем путем можно сделать:
shuf example.txt | sponge example.txt
(к сожалению, moreutils пакет также имеет названный util parallel
это намного менее полезно, чем параллель гну. Я удалил parallel
установленный moreutils)
Я уверен, что вы знаете, что Ubuntu основан на Debian (выпуски Ubuntu периодически сравниваются с тестированием Debian), и между ними много сходства. Тем не менее, они отличаются иногда довольно значительными способами. Например, в течение многих лет Ubuntu использовал upstart
в качестве своей системы инициализации по умолчанию, в то время как Debian придерживался sysvinit
(оба используют systemd
в качестве системы по умолчанию сейчас).
В целом, многие вики Ubuntu должны по-прежнему применяться к Debian. Если вы следуете инструкциям по настройке (и это относится к любой кулинарной книге или HOWTO, которым вы следуете), вы должны проверить их , прежде чем использовать их. Могут быть тонкости в командах между выпусками программного обеспечения и т.д., и ввод команд willy-nilly может оставить вас с очень сломанной системой.
-121--209709-Основными отличиями distros являются менеджеры пакетов. На самом деле за пределами этого бедствия будет в основном то же самое. Может быть, некоторые различия в расположении файлов, но это не часто.
Ubuntu основан на Debian. Я лично не могу думать о команде, которая отличалась бы между ними. Но я уверен, что есть некоторые различия. Как сказал Тердон, 99% всего будет работать. Это будет правдой, если вы пойдете на разные базы, как Красная Шляпа. Арч бросает немного петли, но даже это не так уж и отличается.
T1; dr, Основные отличия - менеджеры пакетов. Все должно работать нормально.
-121--209710-Учитывая следующее дерево (пустое abc.txt):
.
├── zyz
│ └── abc.txt
├── zyz-1
│ └── abc.txt
└── zyz-2
└── abc.txt
Можно перечислить все abc-файлы с помощью:
$ echo zyz*/abc.txt
zyz-1/abc.txt zyz-2/abc.txt zyz/abc.txt
И вы можете использовать tee -a
, чтобы добавить некоторый входной поток ко всем этим файлам одновременно:
$ echo 'New line data' | tee -a zyz*/abc.txt
New line data
Если сделать это дважды, каждый abc.txt будет содержать две строки:
$ cat zyz/abc.txt
New line data
New line data
$ cat zyz-1/abc.txt
New line data
New line data
$ # ...
Чтобы очистить их, вы можете сделать:
$ </dev/null tee zyz*/abc.txt
или
$ : | tee zyz*/abc.txt
(Вы не должны достичь предела ARG_MAX только с несколькими файлами с короткими именами, но с большим количеством файлов я бы использовать найти -exec
в форме +
(см. manpage).)
Для этого есть два общих подхода: find
и подстановка оболочки.
find
имеет параметр -exec
, который позволяет указать действие, выполняемое с каждым из его результатов. Это делает каждый из результатов поиска доступным как {}
, и вы можете изменять их по своему усмотрению. Это немного сложнее, когда вы хотите указать аргументы (например, echo foo> file
). Для этого вам нужно указать команде find exec
запускать оболочку. Итак, чтобы ввести foo
в каждый из найденных файлов, вы должны запустить:
find / etc / -name abc.txt -path "/ etc / zyz *" \
- exec bash -c "echo 'Данные новой строки' >> {}" \;
Подстановка оболочки. Некоторые оболочки (bash, zsh и ksh из моей головы, но я уверен, что их больше) могут справляться с рекурсивным глобированием. В bash это активируется shopt globstar
. Итак, чтобы отобразить Данные новой строки
в каждом из файлов, вы должны запустить:
shopt globstar
для f в /etc/zyz*/**/abc.txt; do echo "Данные новой строки" >> "$ f"; сделано