Bash rm 命令在内部循环中不起作用

Bash rm command not working from inside loop

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

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

其中 <fileName>-<version>.zip 是名称为 "wildcard" 的 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。关于我哪里出错有什么想法吗?

您确定 ${file%%-} 中没有缺少 * 吗?照原样,它只删除尾随 -,如果有的话。