Насколько я понимаю, вы хотите сжать измененное содержимое файлов, но не изменять сами файлы.
Поскольку вы делаете это из сценария оболочки, вы можете просто писать новые, измененные файлы с помощью 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. Затем застегните их и удалите.