【问题标题】:Bash rm command not working from inside loopBash rm 命令在循环内部不起作用
【发布时间】:2015-05-26 17:26:19
【问题描述】:

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

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

&lt;fileName&gt;-&lt;version&gt;.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。关于我要去哪里出错的任何想法?

【问题讨论】:

  • 你为什么不引用你的变量呢?
  • set -x 是你的朋友。将其放入您的脚本中,您将看到它正在运行的实际命令,因此您可以弄清楚名称 munging 如何/为什么没有达到您的预期。
  • @hek2mgl 这是对this well quoted answer 的改编,并添加了一些未引用的内容。
  • @thatotherguy 可能是个愚蠢的问题,但不应该是[[ -e "$file" ]]吗?
  • @hek2mgl [[ .. ]] 中的东西很特别,所以不,那里的引号是无害的,但不是必需的。

标签: bash for-loop glob substitution rm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 2019-12-19
    • 1970-01-01
    • 2021-04-21
    • 2017-06-24
    • 2011-06-02
    • 2012-03-30
    • 2016-02-06
    相关资源
    最近更新 更多