Bash脚本修改和压缩文件

时间:2018-04-26 14:23:49

标签: bash perl

我正在尝试编写一个压缩某些文件的脚本。但是,在某些文件中,我需要更新依赖项的路径。

压缩文件的脚本目前看起来像这样;

#!/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路径从../../utils/更改为./,但我不想更改原始文件中的路径。

我能够像这样更新原始文件中的路径;

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

我怎样才能修改要压缩的文件?

2 个答案:

答案 0 :(得分:1)

我认为您想要压缩已更改的文件内容,但不能自行更改文件。

由于您是通过shell脚本执行此操作,因此使用Perl编写新的,已更改的文件并将其压缩(下面为source/*.js_tmp)很简单,然后将其删除。

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

<> operator从所有提交的文件中读取行。当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。制作这些临时文件名,以免覆盖任何内容。或者,在shell脚本可以创建的新临时目录中使用原始名称,然后删除。

另一个,也许更简单的方法是创建一个临时目录并在shell脚本中将所有文件复制到它,然后在其上运行您的确切Perl单行程序。然后拉链并将它们移除。

答案 1 :(得分:0)

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移动它们或将它们输出到其他地方。

或者,只需将整个项目复制到临时文件系统(最好是ramdisk)上的目录,修改那里的文件,压缩它们然后删除临时副本。

相关问题