파일 이름의 점을 밑줄로 바꿉니다(확장자 제외).

파일 이름의 점을 밑줄로 바꿉니다(확장자 제외).

누군가 파일 이름을 바꾸는 방법을 제안할 수 있습니까?

head.body.date.txt

도착하다:

head_body_date.txt

이름 바꾸기를 수행하는 한 줄 명령문이 있습니까?유닉스?

답변1

파일 이름을 반복하고 매개변수 확장을 사용하여 변환합니다.

for f in *.*.*.txt; do i="${f%.txt}"; echo mv -i -- "$f" "${i//./_}.txt"; done

매개변수 확장 모드 에서는 파일 이름의 ${f//./_}모든 s를 .s()로 바꿉니다._$f

위의 내용은 실제 이름 바꾸기를 위해 연습 실행을 수행하고 다음을 제거합니다 echo.

for f in *.*.*.txt; do i="${f%.txt}"; mv -i -- "$f" "${i//./_}.txt"; done

다음뿐만 아니라 모든 확장을 처리하려는 경우 .txt:

for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
                     echo mv -i -- "$f" "${pre//./_}.${suf}"; done

삭제 후 실제 동작 확인 echo:

for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
                     mv -i -- "$f" "${pre//./_}.${suf}"; done

일반적으로 포인트 수에 관계없이 최소한 하나는 다음과 같습니다.

for f in *.*; do pre="${f%.*}"; suf="${f##*.}"; \
                 mv -i -- "$f" "${pre//./_}.${suf}"; done

답변2

perl기반 으로rename

$ rename -n 's/\.[^.]+$(*SKIP)(*F)|\./_/g' head.body.date.txt 
rename(head.body.date.txt, head_body_date.txt)
  • \.[^.]+$(*SKIP)(*F)이 패턴을 건너뛰고 대체 일치 항목을 찾으세요.
  • |\./_/g모두 .다음으로 교체_

또는 부정적인 예측을 사용하십시오.

$ rename -n 's/\.(?![^.]+$)/_/g' head.body.date.txt 
rename(head.body.date.txt, head_body_date.txt)

확인되면 이 -n옵션 을 삭제하세요.

답변3

rename 's/\.(?=[^.]*\.)/_/g' *.txt

.정규식 대체를 사용하여 파일 이름의 마지막 인스턴스(비캡처 예측)를 제외한 모든 항목을 찾고 원하는 경우 Generalize 로 바꾸세요 _.*.*

(이 특정 버전은 를 rename통해 설치된 것으로 보입니다 util-linux). 나는 Ubuntu 12.04(예, 심각하게 오래된 기계)를 사용하고 있습니다.

답변4

mv한 줄에 사용 sed하고 다음을 수행하십시오.rev

mv "head.body.date.txt" "$(echo head.body.date.txt | rev | sed 's/\./_/2g' | rev)"

txt현재 모든 표현의 모든 파일에 적용하려는 경우 glob을 사용하는 것이 작동하기 까다로워 보이지만 한 줄로 루프를 수행 mv할 수 있습니다 .for

for file in *.txt; do mv "$file" "$(echo $file | rev | sed 's/\./_/2g' | rev)"; done

조금 더 길지만 루프에서 여러 패턴을 일치시킬 수 있습니다!

관련 정보