Bash найти заменить несколько файлов на новые файлы - PullRequest
0 голосов
/ 27 марта 2020

У меня есть каталог с именами файлов шаблонов. В них есть одно значение, которое нужно заменить. Я хотел нетронутую папку с ключевым словом в месте замены в каждом файле. Я хотел заменить слово и вывести все файлы в новую папку с файлами, названными так же, как ввод. Команда, которую я нашел здесь:

find . -name '*.sql' -i -exec sed -e 's/TEXTTOSUBSTITUTE/SUBSTITUTIONTEXT/g' {} \;

Как я могу получить эту команду для вывода файлов в другой каталог и оставить оригиналы без изменений? большое вам спасибо за вашу помощь! Я хочу, чтобы исходные файлы остались без изменений. папка называется Templates, а папка в том же каталоге, что и каталог Templates, называется Usefiles. Файлы шаблонов действуют как базовые файлы и поэтому не должны изменяться. Полагаю, я мог бы использовать приведенное выше предложение, но сделать две отдельные команды поиска, одну для копирования, а другую для sed в новом каталоге ОБНОВЛЕНИЕ >>>> Я пробовал предложения, но sed, кажется, не работает , Копия работает, но sed является переменной и выходит пустым в сценарии. Вот мой ток, и еще раз спасибо !! :

#!/bin/bash

echo "Enter Year i.e. 2020"
read -p reportyear
echo "Enter Month i.e. 04"
read -p reportmonth
SUBSTITUTIONTEXT=$reportyear/$reportmonth

find MOT/ -name '*.sql' -exec sh -c 'for f; do
 echo cp -v "$f" MOU/ && echo sed -ie "s/TEXTTOSUBSTITUTE/$SUBSTITUTIONTEXT/g" MOU/"${f##*/}"
done' _ {} +

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ Спасибо вам, ребята, рабочее решение:

echo "Enter Year i.e. 2020"
read reportyear
echo "Enter Month i.e. 04"
read reportmonth
SUBSTITUTIONTEXT=$reportyear\/$reportmonth
cd /to/relevant/files
find MOT/ -name '*.sql' -exec sh -c 'for f; do 
cp -v "$f" MOU/ && sed -i 's@SUBSTITUTIONYEARMONTH@"$SUBSTITUTIONTEXT"@' MOU/"${f##*/}" 
done' _ {} + > /dev/null 2>&1

Ответы [ 2 ]

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

Как описано в вопросе два каталога Template как source и Usedfiles как destination.

Использование find(1)

find Templates/ -name '*.sql' -exec sh -c 'for f; do
 echo cp -v "$f" Usefiles/ && echo sed -ie "s/TEXTTOSUBSTITUTE/SUBSTITUTIONTEXT/g" Usefiles/"${f##*/}"
done' _ {} +

Другой вариант это использовать шеллопт globstar из bash

#!/usr/bin/env bash

shopt -s globstar

for f in ./Templates/**/*.sql; do
 echo cp -v "$f" Usefiles/ && echo sed -ie 's/TEXTTOSUBSTITUTE/SUBSTITUTIONTEXT/g' Usefiles/"${f##*/}"
done
0 голосов
/ 27 марта 2020

Это может сработать для вас (GNU sed и параллельно):

sub=2020/04
find Templates -name '*.sql'| parallel "sed 's#key#'"$sub"'#g' {} > Usefiles/{/}"

Установите параметр замены в sub.

Передайте команду поиска для параллельного вызова.

Запустите sed для каждого файла из команды поиска и замените $sub на каждый key, поместив вывод в каталог Usefiles в том же каталоге, что и Templates с тем же именем файла.

...