
다음 파일 세트가 있습니다
top_axi_256_wrapper_05.02.01.14.00_sample06.tgz
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz
05.02.01.14.00
부품을 로 교체하고 싶습니다 05_02_01_14_00
. 따라서 최종 출력은 다음과 같이 이름이 바뀐 파일입니다.
top_axi_256_wrapper_05_02_01_14_00_sample06.tgz
top_axi_128_wrapper_05_02_01_14_00_sample06.tgz
내 디렉토리에는 다음 유형의 파일 이름도 포함될 수 있습니다.
a72_a_0.0.0_0.00.04_ac_dc.tgz
여기에서 파일 이름을 다음으로 바꾸고 싶습니다.
a53_1c_256K_a_0_0_0_0_00_04_ac_dc.tgz
어떻게 해야 하나요?
답변1
기본적으로 마지막 점을 제외하고 점을 밑줄로 바꾸고 싶습니다.
이를 위해 bash의 매개변수 확장을 사용할 수 있습니다.
for file in * ; do
replace_all=${file//./_}
newname=${replace_all%_*}.${replace_all##*_}
mv "$file" "$newname"
done
//./_
수단모든 점을 밑줄로 교체%_*
수단마지막 밑줄 뒤의 모든 항목을 제거합니다.##*_
수단마지막 밑줄까지 모두 제거
또는 먼저 확장 프로그램을 저장한 다음 제거하고 모든 점을 밑줄로 바꾼 다음 확장 프로그램을 다시 추가할 수 있습니다. 독자를 위한 연습으로 남겼습니다.
답변2
기반 유틸리티 perl
는 검색 및 바꾸기 연산자나 번역 연산자 뿐만 아니라 rename
모든 명령문을 사용하여 파일 이름을 바꿀 수 있습니다 ( 파일 이름을 바꾸려는 항목으로 설정했는지 확인하십시오 ).perl
s///
y//
$_
에서 man rename
:
"rename"은 첫 번째 인수로 지정된 규칙에 따라 제공된 파일 이름을 바꿉니다. perlexpr 인수는
$_
지정된 파일 이름 중 적어도 일부에 대해 Perl의 문자열을 수정할 것으로 예상되는 Perl 표현식입니다 . 주어진 파일 이름이 표현식에 의해 수정되지 않으면 이름이 바뀌지 않습니다. 명령줄에 파일 이름이 지정되지 않으면 표준 입력을 통해 파일 이름을 읽습니다.
예를 들어:
rename 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' files
그러면 파일 이름이 기본 이름($b)과 확장자($e)로 분할됩니다. $b는 모든 마침표( .
)를 밑줄로 대체합니다. 마지막으로 $_
로 설정되었습니다 "$b.$e"
.
출력( -v
verbose 옵션 사용):
$ touch top_axi_256_wrapper_05.02.01.14.00_sample06.tgz \
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz \
a72_a_0.0.0_0.00.04_ac_dc.tgz
$ rename -v 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' *
a72_a_0.0.0_0.00.04_ac_dc.tgz renamed as a72_a_0_0_0_0_00_04_ac_dc.tgz
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_128_wrapper_05_02_01_14_00_sample06.tgz
top_axi_256_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_256_wrapper_05_02_01_14_00_sample06.tgz
그런데, 진술을 -n
테스트하는 동안 사용하십시오 rename
. 더 많은 것 man rename
:
-n, -노노
조치 없음: 이름을 바꿀 파일 이름을 인쇄하지만 이름을 바꾸지는 않습니다.
Perl은 rename
대부분의 배포판(예: rename
Debian의 패키지)에서 패키지로 제공되거나https://metacpan.org/release/File-Rename