Как добавить строку для всех строк всех файлов в каталоге в Bash? - PullRequest
0 голосов
/ 21 марта 2020

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

sed -e 's/$/ sample string/' -i test.txt

, но как написать сценарий, который делает это для всех файлов, найденных в иерархии каталогов (и ее подкаталогах и подкаталоги так далее ...)?

1 Ответ

1 голос
/ 21 марта 2020

для всех файлов, найденных в иерархии каталогов (и ее подкаталогах и подкаталогах и т. Д.)

Это задание для find, просто и просто.

Например, команда:

find . -type f -exec sed -i 's/$/ sample string/' {} \;

выполнит эту команду sed для всех обычных файлов в и в текущем каталоге.

Команда find имеет намного больше опций (ограничение глубины, не пересекает границы файловой системы, работает только с определенными масками файлов и т. Д.), Которые вы можете использовать, но, вероятно, все, что вам нужно для ответа на ближайший вопрос, - это те, которые приведены выше.


Имейте в виду, что sed -i - это редактирование на месте, поэтому, если вы допустили ошибку, вам лучше убедиться, что вы создали резервные копии исходных файлов заранее.

В этом случае где вы хотите создать новые файлы (как требуется в комментарии), вы можете обойти -i и создавать новые файлы. Возможно, самый безопасный способ сделать это - поместить команды, которые вы хотите выполнить, в исполняемый скрипт (например, myprog.sh):

#!/usr/bin/env bash

origName="$1"
newName="$1.new"
sed s/$/ sample string/' "${origName}" > "${newName}"

Затем вызвать это из вашего find:

find . -type f -exec myprog.sh {} \;

Затем вы можете сделать имя целевого файла произвольно сложным значением, рассчитанным из оригинала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...