【问题标题】:Bash command-line to rename wildcardBash 命令行重命名通配符
【发布时间】:2015-05-26 16:47:24
【问题描述】:

在我的/opt/myapp 目录中,我有一个远程自动化进程,它将删除<anything>-<version>.zip 形式的文件,其中<anything> 可以是任何 字母数字文件名,而@987654324 @ 将是一个版本号。因此,该自动化流程将交付的示例如下:

  • fizz-0.1.0.zip
  • buzz-1.12.35.zip
  • foo-1.0.0.zip
  • bar-3.0.9.RC.zip

等等。通过此问题范围之外的控制,我保证在任何给定时间,/opt/myapp 下只会存在这些 ZIP 文件中的一个。我需要编写一个 Bash shell 命令 来重命名这些文件并将它们移动到/opt/staging。对于重命名,ZIP 文件需要删除其版本。所以/opt/myapp/<anything>-<version>.zip 被重命名并移动到/opt/staging/<anything>.zip。使用上面的例子:

  • /opt/myapp/fizz-0.1.0.zip => /opt/staging/fizz.zip
  • /opt/myapp/buzz-1.12.35.zip => /opt/staging/buzz.zip
  • /opt/myapp/foo-1.0.0.zip => /opt/staging/foo.zip
  • /opt/myapp/bar-3.0.9.RC.zip => /opt/staging/bar.zip

目录移动很明显也很容易,但是重命名让我抓狂了。我需要以某种方式保存<anything>,然后稍后在命令中重新访问它。 命令必须是通用的,并且不能带参数。

到目前为止,我最好的尝试(甚至还没有接近工作)是:

文件=*.zip;文件=?; mv 文件 /opt/staging

关于如何做到这一点的任何想法?

【问题讨论】:

  • 感谢@chepner,但请取消标记为骗子!在该问题中,用户知道“doc”一词将始终出现在文件名中,在这里我不确定<anything> 是什么!!! 这不是同一个问题,需要不同的解决方案! 举报审核。
  • 这有什么不同? (建议的重复项不再链接,因此很难判断其解决方案是否/为什么会起作用)。

标签: linux bash filesystems


【解决方案1】:
for file in *.zip; do
  [[ -e $file ]] || continue # handle zero-match case without nullglob
  mv -- "$file" /opt/staging/"${file%-*}.zip"
done

${file%-*} 删除文件名中最后一个 - 之后的所有内容。因此,我们将fizz-0.1.0.zip 更改为fizz,然后添加一个前导/opt/staging/ 和一个尾随.zip


要使其更通用(使用多个扩展),请参阅以下函数(可作为命令调用;如果删除了 local 声明,函数体也可以放入带有 #!/bin/bash shebang 的脚本中) :

stage() {
  local file ext
  for file; do
    [[ -e $file ]] || continue
    [[ $file = *-*.* ]] || {
      printf 'ERROR: Filename %q does not contain a dash and a dot\n' "$file" >&2
      continue
    }
    ext=${file##*.}
    mv -- "$file" /opt/staging/"${file%-*}.$ext"
  done
}

...定义了该函数后,您可以运行:

stage *.zip *.txt

...或您选择的任何其他模式。

【讨论】:

  • @JonathanLeffler,...进行测试的部分原因是我收集到 OP 想要将其称为脚本(这也是我在转换它的注释中添加的原因来自函数);不一定能控制调用环境。
【解决方案2】:
f=foo-1.3.4.txt
echo ${f%%-*}.${f##*.}

【讨论】:

  • 看起来你在那里使用了一些相当晦涩的 shell 语法,这需要解释它的作用。
  • @SamB,参数扩展并不是那么晦涩难懂——实际上,我的回答也使用了它。见wiki.bash-hackers.org/syntax/pe
猜你喜欢
  • 2022-07-26
  • 2014-08-05
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多