다음 파일 세트가 있습니다
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
자세한 옵션 포함):
$ 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