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
예시에서는 이전/이후를 표시하기 위해서만 사용되었습니다.