Скрипт Bash для изменения и архивирования файлов - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь написать скрипт, который архивирует некоторые файлы. Однако в некоторых файлах мне нужно обновить путь к зависимости.

Скрипт для архивирования файлов в данный момент выглядит так:

#!/bin/sh

for APP in "${APPS[@]}"
do
  cd app/${APP}
  npm install
  zip -r ../../test.zip node_modules
  zip -uj ../../test.zip src/*.js
  cd ../../

  zip -uj test.zip app/utils/*.js
done

В src/*.js есть такой импорт;

const someUtil = require('../../utils/someUtil')

Во время архивации этих файлов мне нужно изменить путь к утилитам с ../../utils/ на ./, но я не хочу менять путь в исходном файле.

Мне удалось обновить путь в исходном файле, как этот;

perl -pi -e 's/..\/..\/utils\//.\//g' src/*.js

Как я могу изменить только файл, который должен быть заархивирован?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Насколько я понимаю, вы хотите сжать измененное содержимое файлов, но не изменять сами файлы.

Поскольку вы делаете это из сценария оболочки, вы можете просто писать новые, измененные файлы с помощью Perl и архивировать их (source/*.js_tmp ниже), а затем удалять их.

perl -we'while (<>) { 
    open $fh, ">${ARGV}_tmp" if eof;
    print $fh s{../../utils}{/.}gr;
}' source/*.js

Оператор <> читает строки из всех представленных файлов. Новый файл открывается, когда eof обнаруживает последнюю строку в файле (или неоткрытый дескриптор файла) с именем, полученным из текущего $ ARGV . Модификатор /r в регулярном выражении заставляет оператора s/ возвращать измененную строку вместо ее изменения на месте.

Или, используя Path :: Tiny

perl -MPath::Tiny -we'
    path("${_}_tmp")->spew( path($_)->slurp =~ s{../../utils}{./}gr ) for @ARGV
' source/*.js

Модуль очень удобен и стоит быстрой установки.

Обе команды выше записывают измененные файлы как source/*.js_tmp, для простоты. Сделайте эти временные имена файлов, чтобы ничего не перезаписывать. Или используйте оригинальные имена в новом временном каталоге, который может создать сценарий оболочки, а затем удалите.

Другой, возможно, более простой способ - создать временный каталог и скопировать все файлы в него в сценарии оболочки, а затем запустить на нем свой точный однострочный Perl. Затем застегните их и удалите.

0 голосов
/ 26 апреля 2018

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

mkdir --parents to-be-zipped/src
for f in src/*.js; do
  sed -e 's/..\/..\/utils\//.\//g' $f >to-be-zipped/$f
done

Тогда измененные файлы, которые будут заархивированы, будут находиться в каталоге с именем to-be-zipped. Если это неподходящее место, вы можете переместить их с помощью mv или вывести их в другое место.

В качестве альтернативы, просто скопируйте весь ваш проект в каталог во временной файловой системе (в идеале на виртуальный диск), измените файлы там, заархивируйте их, а затем удалите временную копию.

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