_ 및 .가 포함된 여러 파일의 이름을 바꾸는 방법은 무엇입니까?

_ 및 .가 포함된 여러 파일의 이름을 바꾸는 방법은 무엇입니까?

Linux bash 쉘에는 다음과 같은 여러 개의 tif 파일(약 1000개)이 있습니다.

Sep04_17.00.37.tif  Sep04_17.05.54.tif  Sep04_17.08.41.tif
Sep04_17.02.02.tif  Sep04_17.07.17.tif

이름에서 _ 및 .를 제거하는 방법은 무엇입니까? 최종 결과는 다음과 같습니다.

Sep04170037.tif  Sep04170554.tif  Sep04170841.tif
Sep04170202.tif  Sep04170717.tif

나는 이름을 바꾸려고 노력했습니다: rename 's/\_/\//' *.tif ; rename 's/\_/\//g' *.tif; 그 중 아무것도 작동하지 않습니다.

답변1

귀하의 접근 방식이 정확합니다. 어쩌면 각 파일 이름 g의 모든 합계와 일치하는 정규식의 꼬리를 놓쳤을 수도 있습니다 .._

와 함께 사용하려면 rename다음 2단계 접근 방식을 권장합니다.

rename 's/[._]//g' *.tif    # remove any . and _ occurence

생산하다:

Sep04170037tif Sep04170202tif Sep04170554tif Sep04170717tif Sep04170841tif

그 다음에

rename 's/tif$/.tif/' *tif    # replace ending tif by .tif

~로 이어지다

Sep04170037.tif Sep04170202.tif Sep04170554.tif Sep04170717.tif Sep04170841.tif

주저하지 말고 먼저 온라인으로 정규식을 시도해 보세요.정규 표현식 101, 이는 또한 PCRE에 대해 많은 것을 가르쳐줍니다 :)


[편집]: 한 줄짜리를 선호하는 경우:

rename 's/[._]//g;s/tif$/.tif/' *.tif

tif또한 불행하게도 두 번째 단계로 끝나는 인접한 관련 없는 파일의 일치도 방지합니다 .

답변2

변형은 다음을 사용합니다 sed.

for file in *tif; do newname=$(echo "$file" | sed 's/_//;s/\.\([0-9]\)/\1/g'); mv -v "$file" "$newname"; done
'Sep04_17.00.37.tif' -> 'Sep04170037.tif'
'Sep04_17.02.02.tif' -> 'Sep04170202.tif'
'Sep04_17.05.54.tif' -> 'Sep04170554.tif'
'Sep04_17.07.17.tif' -> 'Sep04170717.tif'
'Sep04_17.08.41.tif' -> 'Sep04170841.tif'

mv -v예시에서는 이전/이후를 표시하기 위해서만 사용되었습니다.

관련 정보