디렉토리에 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'
zmv
Perl 기반 이름 바꾸기를 사용하면 다음 명령을 사용하여 동일한 작업을 수행할 수 있습니다(protection 없이도 ).
rename -v 's/^(\d+)\.svg\Z/A${1}Solid.svelte/' [0-9]*.svg
[0-9]*.svg
0 ~ 9 범위의 문자( 일부 쉘에서는 bash
0123456789를 포함하되 이에 국한되지 않음 )로 시작하고 로 끝나는 파일 이름으로 확장되지만 .svg
, rename
ASCII 10진수(0123456789) 뒤에 .svg
.
glob을 사용한다는 [0-9]*.svg
것은 파일 이름이 로 시작하지 않는다는 것을 의미합니다 . 이는 모든 변형이 아닌 에 대한 지원이 -
필요하지 않음을 의미합니다 (반면 다른 버전에서는 이를 생략하면 명령 주입 취약점이 발생합니다!). 모든 사람이 그것을 지원하는 것도 아닙니다 .--
perl
rename
-v
파일의 루트 이름을 대문자로 사용하여 추가하려는 경우 Solid.svelte
,뿐만 아니라be 와 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
로 사용할 수 없음).É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
(위의 예에서는 이름에 개행 문자가 포함되어 있지 않으며 다른 흥미로운 문자가 없을 수도 있다고 가정합니다.)