【发布时间】:2015-05-26 17:26:19
【问题描述】:
在任何给定时间,我的 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。关于我要去哪里出错的任何想法?
【问题讨论】:
-
你为什么不引用你的变量呢?
-
set -x是你的朋友。将其放入您的脚本中,您将看到它正在运行的实际命令,因此您可以弄清楚名称 munging 如何/为什么没有达到您的预期。 -
@hek2mgl 这是对this well quoted answer 的改编,并添加了一些未引用的内容。
-
@thatotherguy 可能是个愚蠢的问题,但不应该是
[[ -e "$file" ]]吗? -
@hek2mgl
[[ .. ]]中的东西很特别,所以不,那里的引号是无害的,但不是必需的。
标签: bash for-loop glob substitution rm