Bash rm命令无法从内部循环中运行

时间:2015-05-26 17:26:19

标签: bash for-loop glob substitution rm

在任何给定时间,我的Linux服务器将在/opt下具有以下目录结构:

/opt/
    myapp/
        <fileName>-<version>.zip
    <fileName>/
        derp.txt
    staging/

其中<fileName>-<version>.zip是带有“通配符”名称的ZIP文件。有一刻它可能是fizz-1.0.1.zip,在这种情况下文件系统看起来像:

/opt/
    myapp/
        fizz-1.0.1.zip
    fizz/
        derp.txt
    staging/

然后一小时后,文件系统可能如下所示:

/opt/
    myapp/
        buzz-2.11.15.zip
    buzz/
        derp.txt
    staging/

我正在尝试编写一个清理bash命令,它将扫描/opt/myapp目录中的ZIP文件(*.zip),重命名它们并将它们移动到/opt/staging,以及删除derp.txt文件。对于重命名,我只想删除连字符和版本号,例如将fizz-1.0.1.zip转换为fizz.zip。例如,在文件系统看起来像这样运行脚本:

/opt/
    myapp/
        fizz-1.0.1.zip
    fizz/
        derp.txt
    staging/

应该导致:

/opt/
    myapp/
    fizz/
    staging/
        fizz.zip

我保证在任何给定时间内/opt/myapp内只有1个ZIP文件。我最好的尝试是:

for file in *.zip; do 
    [[ -e $file ]] || continue
    sudo mv "$file" /opt/staging/"${file%%-*}.zip"
    sudo rm -rf /opt/${file%%-}/derp.txt
done

执行ZIP文件的重命名和移动,但不删除derp.txt。关于我哪里出错的任何想法?

1 个答案:

答案 0 :(得分:3)

您确定*中某处${file%%-}遗失了吗?按原样,它只删除尾随的-,如果有的话。