微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bash命令行重命名通配符

在我的/opt/myapp目录中,我有一个远程自动化进程,它将删除<anything>-<version>.zip格式的<anything>-<version>.zip ,其中<anything>可以是字母数字文件名,而<version>将会是一个版本号。 那么,这个自动化过程将会实现的例子有:

fizz-0.1.0.zip

buzz-1.12.35.zip

foo-1.0.0.zip

bar-3.0.9.RC.zip

等等。通过这个问题范围之外的控制,我保证在任何给定的时间只有其中一个ZIP文件存在于/opt/myapp下。 我需要编写一个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> ,然后在命令中重新访问它。 该命令必须是通用的,可以不带任何参数。

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

内容添加文件的中间,直到最后才读取

Android文件系统日记

在Windows 7上:相同的path,但资源pipe理器和Java看到不同于Powershell的文件

从linux中不同偏移量的文件读取

如何使符号链接与远程挂载一起工作?

文件= *拉链。 文件= ?; mv文件/ opt / staging

任何想法如何做到这一点?

充满10M +日志文件文件夹,我无法删除它们

什么是在c#中的文件夹中find最新创build的文件的好方法

使用Java应用程序模拟NTFS / FAT分区

在java中获取原始文件名?

为什么硬链接不允许在UNIX / Linux目录

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的文件):

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

…定义了这个函数,你可以运行:

stage *.zip *.txt

…或者你选择的任何其他模式。

f=foo-1.3.4.txt echo ${f%%-*}.${f##*.}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐