【问题标题】:Rename files to new naming convention in bash在 bash 中将文件重命名为新的命名约定
【发布时间】:2019-05-02 02:35:27
【问题描述】:

我有一个文件目录,其名称格式如下

01-Peterson@2x.png
15-Consolidated@2x.png
03-Brady@2x.png

我想像这样格式化它们

PETERSON.png
CONSOLIDATED.png
BRADY.png

但是我的 bash 脚本编写技能现在很弱。解决此问题的最佳方法是什么?

编辑:我的 bash 版本是 3.2.57(1)-release

【问题讨论】:

  • 看看 perl rename 工具。
  • 您应该稍微改进一下您的问题,例如添加更多文件名以确认模式,以及提供您的 bash 版本 (echo $BASH_VERSION)
  • @Socowi 我的机器上似乎没有重命名-bash: rename: command not found
  • @AlexandreJuma 感谢您的建议!我使用该信息编辑了原始问题。

标签: bash awk rename


【解决方案1】:

这将适用于包含空格(包括换行符)、反斜杠或任何其他字符的文件,包括可能导致目录中其他文件错误匹配的通配符,并且不会删除您的主文件系统给定一个特别不受欢迎的文件名!

for old in *.png; do
    new=$(
        awk 'BEGIN {
                base = sfx = ARGV[1]
                sub(/^.*\./,"",sfx)
                sub(/^[^-]+-/,"",base)
                sub(/@[^@.]+\.[^.]+$/,"",base)
                print toupper(base) "." sfx
                exit
            }' "$old"
        ) &&
    mv -- "$old" "$new"
done

【讨论】:

    【解决方案2】:

    如果你所有文件的模式都和你发布的一样,我想说你可以做一些简单的事情,比如在你的目录上运行它:

    for file in `ls *.png`; do new_file=`echo $file | awk -F"-" '{print $2}' | awk -F"@" '{n=split($2,a,"."); print toupper($1) "." a[2]}'`; mv $file $new_file; done
    

    如果您喜欢学习其他解决方案,例如正则表达式,您也可以这样做:

    for file in `ls *.png`; do new_file=`echo $file | sed "s/.*-//g;s/@.*\././g" | tr '[:lower:]' '[:upper:]'`; mv $file $new_file; done 
    

    测试它,例如:

    mv 01-Peterson@2x.png PETERSON.png
    mv 02-Bradley@2x.png BRADLEY.png
    mv 03-Jacobs@2x.png JACOBS.png
    mv 04-Matts@1x.png MATTS.png
    mv 05-Jackson@4x.png JACKSON.png
    

    【讨论】:

    • 成功了!我刚刚使用了您的第一个示例。谢谢您的帮助。我将花一些时间学习awk 工具。据我所知,您的解决方案使用awk-F 标志用于字段分隔,因此它对字符串进行拆分。我对第二次调用的细节有点迷失(比如a 的来源),但看起来它正在获取文件扩展名并将其附加到大写文件名。无论如何,它看起来很棒,再次感谢您的帮助!
    • 是这样的:第一个awk只会删除第一个“01-”,第二个会用“@”分割,并保留一个用“.”分割的字符串的最后一项。 , 这实际上是文件扩展名。然后它提取文件名(这是用“@”分割时的第一项)并将其连接到文件扩展名。
    • 这个答案包含多个 anit 模式,包括在 ls 的输出上循环,而不仅仅是 globbing,使用 for file in 而不是 while read file,使用不推荐使用的反引号而不是 $(...),未引用的变量像$file 而不是"$file",即使前面的命令失败也移动文件,并且它会调用多个工具。不要这样做...
    猜你喜欢
    • 2020-02-18
    • 2017-09-28
    • 2016-09-23
    • 2017-12-12
    • 1970-01-01
    • 2019-09-02
    • 2012-12-31
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多