当文件名开头有数字时,如何在目录中的文件名前面添加字母

当文件名开头有数字时,如何在目录中的文件名前面添加字母

我的目录中有一堆 SVG 文件。

0.svg 
1.svg 
2.svg ...
42Group.svg 
500px.svg
file1.svg 
file2.svg ...

如果文件名以数字开头,我想添加字母 A。

例如,我想更改0.svgA0Solid.svelte.

目前我有以下转换文件名的方法:

rename -v 's/./\U$&/;s/-(.)/\U$1/g;s/\.svg$/Solid.svelte/' -- *.svg > /dev/null 2>&1

但这会转换0.svg0Solid.svelte.我想把它改成A0Solid.svelte.

我怎样才能用 Bash/Shell 做到这一点?

[Updates]:我将 42Group.svg 500px.svg 添加到文件名中。

答案1

zsh代替bash, 重命名<digits>.svgA<digits>Solid.svelte:

autoload -Uz zmv

批量autoloadzmv命名功能(最佳~/.zshrc

zmv -v '(<->).svg' 'A${1}Solid.svelte'

使用基于 perl 的重命名,您可以使用以下命令执行相同的操作(尽管没有 的保护措施zmv):

rename -v 's/^(\d+)\.svg\Z/A${1}Solid.svelte/' [0-9]*.svg

扩展[0-9]*.svg为以 0 到 9 范围内的字符开头(包括但在某些 shell 中bash不限于 0123456789)并以 结尾的文件名.svg,但rename只会重命名仅由 ASCII 十进制数字组成的文件名 (0123456789)其次是.svg

使用[0-9]*.svgglob 还意味着文件名不会以 开头-,这意味着我们不需要基于--which not all 变体的perl支持rename(而对于其他版本,省略它会引入命令注入漏洞!)。也不是所有人都支持-v

如果目的是将文件的根名称大写并追加Solid.svelte但是也在以数字开头的文件名前面加上前缀A,例如foo-bar.svg成为FooBarSolid.svelte0.svg A0Solid.svelte并且0foo-bar.svg A0FooBarSolid.svelte正如您的代码似乎试图做的那样,您会这样做:

zmv -v '([0-9]#)(*).svg' '${1:+A$1}${${(C)2}//-}Solid.svelte'

或者与rename

rename -v 's{^\./(\d*)(.*)\.svg\Z}{
    ($1 eq "" ? "" : "A$1") . ($2 =~ s/\w+/\u$&/gr =~ s/-//gr) . "Solid.svelte"
  }ge' ./*.svg

请记住,与 相反zmv,它仅适用于 ASCII 文本(例如,不能大写éricto )。Éric

; $_ = "A$_" if /^\d/或者,如果您对现有代码感到满意,则可以通过添加前缀 a(A如果文件名以十进制数字开头)来扩展已有的代码。

答案2

即使是复杂的文件重命名也可以使用管道完成,包括 while 循环read

ls -1 |
    grep '^[0-9]' |
    while read f
    do
        mv -v "$f" "A${f}otherText.svg"
    done

(上面的示例假设名称不包含换行符,并且可能没有其他有趣的字符。)

相关内容