我有一个包含PNG图像的文件系统。文件系统的布局是:ZOOM/X/Y.png
,其中ZOOM,X和Y都是整数。
我需要更改PNG文件的名称。基本上,我需要将Y从其当前值转换为2 ^ ZOOM-Y-1。我写了一个bash脚本来完成这个任务。但是,我怀疑它可以大大优化。 (我也怀疑在Perl中编写它可能会更好,但这是另一个故事。)
这是脚本。这和它一样好吗?或者可以优化性能?是否有我可以使用的工具可以为我分析脚本并告诉我在哪里花费所有执行时间?
#!/bin/bash
tiles=`ls -d */*/*`
for oldPath in $tiles
do
oldY=`basename -s .png $oldPath`
zoomX=`dirname $oldPath`
zoom=`echo $zoomX | sed 's#\([^\]\)/.*#\1#'`
newY=`echo 2^$zoom-$oldY-1|bc`
mv ${zoomX}/${oldY}.png ${zoomX}/${newY}.png
done
答案 0 :(得分:2)
for oldpath in */*/*
do
x=$(basename "$oldpath" .png)
zoom_y=$(dirname "$oldpath")
y=$(basename "$zoom_y")
ozoom=$(dirname "$zoom_y")
nzoom=$(echo "2^$zoom-$y-1" | bc)
mv "$oldpath" $nzoom/$y/$x.png
done
这可以避免使用sed
。我喜欢basename
和dirname
。但是,您也可以使用bash(和Korn)shell表示法,例如:
y=${zoom_y#*/}
ozoom=${zoom_y%/*}
您可以在不调用basename
或dirname
的情况下完成所有操作。
答案 1 :(得分:1)
重命名的整体吞吐量可能受文件系统的限制。选择正确的文件系统并针对这种操作进行调整将比调整脚本更加快速地完成整个工作。
如果优化脚本,您可能会看到较少的CPU消耗,但总持续时间相同。由于分离各种子流程(basename
,dirname
,sed
,bc
)可能比实际工作更重要perl
实现将使用更少的CPU,因为它可以在内部执行所有这些操作(包括mv
)。
答案 2 :(得分:1)
REWRITE由于对公式和更新的var名称的误解。除mv
和ls
之外,仍然没有子流程。
#!/bin/bash
tiles=`ls -d */*/*`
for thisPath in $tiles
do
thisFile=${thisPath#*/*/}
oldY=${thisFile%.png}
zoomX=${thisPath%/*}
zoom=${thisPath%/*/*}
newY=$(((1<<zoom) - oldY - 1))
mv ${zoomX}/${oldY}.png ${zoomX}/${newY}.png
done
答案 3 :(得分:1)
如果是我的剧本,我会看到我会做的3项改进。他们是否会产生巨大影响 - 我不这么认为。
但你应该避免解析ls
的输出。也许这个目录是非常可预测的,从内部发现的东西,但如果我正确地读取你的脚本,你可以直接使用globbing:
for thisPath in */*/*
重复,$(cmd)优于cmd
,不推荐使用不可嵌套的反引号。
thisDir=$(dirname $thisPath)
直接在bash算术:
newTile=$((2**$zoom-$thisTile-1))
只要你不需要浮点,或输出就太大了。
我没有得到sed-part:
zoom=`echo $zoomX | sed 's#\([^\]\)/.*#\1#'`
反斜杠后有什么东西丢失了吗?第二个?你正在寻找一些不是反斜杠的东西,然后是一个斜线 - 什么?也许它可以纯粹用bash来完成。
答案 4 :(得分:0)