我的目录中有一堆 SVG 文件。
0.svg
1.svg
2.svg ...
42Group.svg
500px.svg
file1.svg
file2.svg ...
如果文件名以数字开头,我想添加字母 A。
例如,我想更改0.svg
为A0Solid.svelte
.
目前我有以下转换文件名的方法:
rename -v 's/./\U$&/;s/-(.)/\U$1/g;s/\.svg$/Solid.svelte/' -- *.svg > /dev/null 2>&1
但这会转换0.svg
为0Solid.svelte
.我想把它改成A0Solid.svelte
.
我怎样才能用 Bash/Shell 做到这一点?
[Updates]
:我将 42Group.svg 500px.svg 添加到文件名中。
答案1
用zsh
代替bash
, 重命名<digits>.svg
为A<digits>Solid.svelte
:
autoload -Uz zmv
批量autoload
重zmv
命名功能(最佳~/.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]*.svg
glob 还意味着文件名不会以 开头-
,这意味着我们不需要基于--
which not all 变体的perl
支持rename
(而对于其他版本,省略它会引入命令注入漏洞!)。也不是所有人都支持-v
。
如果目的是将文件的根名称大写并追加Solid.svelte
,但是也在以数字开头的文件名前面加上前缀A
,例如foo-bar.svg
成为FooBarSolid.svelte
,0.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 文本(例如,不能大写éric
to )。É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
(上面的示例假设名称不包含换行符,并且可能没有其他有趣的字符。)