파일 이름이 숫자로 시작할 때 디렉토리의 파일 이름 앞에 문자를 추가하는 방법

파일 이름이 숫자로 시작할 때 디렉토리의 파일 이름 앞에 문자를 추가하는 방법

디렉토리에 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 범위의 문자( 일부 쉘에서는 bash0123456789를 포함하되 이에 국한되지 않음 )로 시작하고 로 끝나는 파일 이름으로 확장되지만 .svg, renameASCII 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를 추가하여 코드를 확장할 수 있습니다.

답변2

while 루프를 포함하여 파이프를 사용하면 복잡한 파일 이름 바꾸기도 수행할 수 있습니다 read.

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

(위의 예에서는 이름에 개행 문자가 포함되어 있지 않으며 다른 흥미로운 문자가 없을 수도 있다고 가정합니다.)

관련 정보