bash脚本根据计算重命名文件

时间:2011-05-16 22:42:46

标签: bash

我有一个包含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

5 个答案:

答案 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。我喜欢basenamedirname。但是,您也可以使用bash(和Korn)shell表示法,例如:

y=${zoom_y#*/}
ozoom=${zoom_y%/*}

您可以在不调用basenamedirname的情况下完成所有操作。

答案 1 :(得分:1)

重命名的整体吞吐量可能受文件系统的限制。选择正确的文件系统并针对这种操作进行调整将比调整脚本更加快速地完成整个工作。

如果优化脚本,您可能会看到较少的CPU消耗,但总持续时间相同。由于分离各种子流程(basenamedirnamesedbc)可能比实际工作更重要perl实现将使用更少的CPU,因为它可以在内部执行所有这些操作(包括mv)。

答案 2 :(得分:1)

REWRITE由于对公式和更新的var名称的误解。除mvls之外,仍然没有子流程。

#!/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)

唐纳德·克努特(Donald Knuth)的一项计算方法是“不要太早优化”。脚本运行速度非常快,并且'mv'操作(只要它们不会跨越文件系统,你真正将它复制到另一个磁盘然后删除文件)也很快,因为所有文件系统都必须在大多数情况只是重命名文件或更改其父母    可能它花费大部分时间的地方是在那个初始的'ls'操作中。我怀疑你有很多文件。那里没有太多可以做的事情。像perl或python这样的另一种语言将面临同样的障碍。但是,您可以获得更多的智能,而不是将自己限制在3个级别( / / *)。