누군가 파일 이름을 바꾸는 방법을 제안할 수 있습니까?
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
조금 더 길지만 루프에서 여러 패턴을 일치시킬 수 있습니다!