ファイル名が数字で始まるときにディレクトリのファイル名の前に文字を追加する方法

ファイル名が数字で始まるときにディレクトリのファイル名の前に文字を追加する方法

ディレクトリに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>.svgA<digits>Solid.svelte

autoload -Uz zmv

一括名前autoload変更zmv機能(最高~/.zshrc

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

zmvPerlベースの名前変更を使用すると、次のコマンドを使用して同じ操作を実行できます(protectionなしで)。

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

[0-9]*.svg0〜9の範囲の文字(一部のシェルでbashは0123456789を含むがこれに限定されない)で始まり、で終わるファイル名に拡張されますが.svgrenameASCII 10進数(0123456789)の後に.svg

globを使用すること[0-9]*.svgは、ファイル名がで始まらないことを意味します。これは、すべてのバリアントではなくサポートを-必要としないことを意味します(他のバージョンでは、これを省略するとコマンドインジェクションの脆弱性が発生します!)。誰もがそれをサポートしているわけではありません。--perlrename-v

ファイルのルート名を大文字にして追加する場合はSolid.svelteだけでなくbeのAように数字で始まるファイル名プレフィックスを使用し、コードで試しているように、次のようにします。foo-bar.svgFooBarSolid.svelte0.svg A0Solid.svelte0foo-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

これとは対照的に、zmvASCIIテキストでのみ機能します(たとえば、大文字éricとしては使用できません)。Éric

; $_ = "A$_" if /^\d/または、既存のコードが満足しているA場合は、ファイル名が10進数で始まる場合は、プレフィックスaを追加してコードを拡張できます。

おすすめ記事