Изменить несколько файлов в разных папках одной командой?

Пакет 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)

2
27.07.2015, 00:22
2 ответа

Я уверен, что вы знаете, что 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).)

2
27.01.2020, 21:59

Для этого есть два общих подхода: find и подстановка оболочки.

  1. find имеет параметр -exec , который позволяет указать действие, выполняемое с каждым из его результатов. Это делает каждый из результатов поиска доступным как {} , и вы можете изменять их по своему усмотрению. Это немного сложнее, когда вы хотите указать аргументы (например, echo foo> file ). Для этого вам нужно указать команде find exec запускать оболочку. Итак, чтобы ввести foo в каждый из найденных файлов, вы должны запустить:

     find / etc / -name abc.txt -path "/ etc / zyz *" \ 
     - exec bash -c "echo 'Данные новой строки' >> {}" \; 
     
  2. Подстановка оболочки. Некоторые оболочки (bash, zsh и ksh из моей головы, но я уверен, что их больше) могут справляться с рекурсивным глобированием. В bash это активируется shopt globstar . Итак, чтобы отобразить Данные новой строки в каждом из файлов, вы должны запустить:

     shopt globstar 
    для f в /etc/zyz*/**/abc.txt; do echo "Данные новой строки" >> "$ f"; сделано 
     
2
27.01.2020, 21:59

Теги

Похожие вопросы