대량 이름 바꾸기, 접두사 변경


53

많은 파일의 접두사를 대량으로 바꾸려면 어떻게해야합니까?

나는 많은 파일을 가지고있다.

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

나는 그들 모두를 바꾸고 싶습니다

  • CLConnectionContext.h
  • CLConnectionContext.m

어떻게해야합니까?

답변:


38
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

이 명령은 bash 명령 대체를 사용하여 via를 통해 입력 파일 이름에서 처음 6자를 제거 하고 결과 cut앞에 추가 CL하고에 저장합니다 $newname. 그런 다음 이전 이름을 새 이름으로 바꿉니다. 이것은 모든 파일에서 수행됩니다.

cut -c7-색인 7 이후의 문자 만 입력에서 리턴되도록 지정합니다. 7-는 끝없는 인덱스 7에서 시작하는 범위입니다. 즉, 줄 끝까지.

이전에는을 사용 cut -b7-했지만 -cUTF-8과 같이 문자 당 여러 바이트를 가질 수있는 문자 인코딩을 처리하는 데 사용해야합니다.


Thx, 나도 지금 이걸 얻었 어. 답변으로 표시 Thx
ErikTJ

고마워요. -b7-의 기능을 설명 할 수 있습니까? 이 바이트 목록에 대한 참조입니까? ss64.com/bash/cut.html
16:01

@imjared 자세한 내용으로 답변을 업데이트했습니다.
mrb

56

rename많은 Linux 배포판에서 일반적으로 사용되는 명령을 사용하는 것이 가장 간단하다고 말하고 싶습니다 . 이 명령에는 두 가지 공통 버전이 있으므로 해당 매뉴얼 페이지에서 다음 중 하나를 찾으십시오.

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

데비안 시스템에서 util-linux-ng의 버전을 사용하려면 이름 아래에 있습니다. rename.ul


7
경고 : rename야생에는 여러 버전이 존재합니다. rename사용 방법을 알아 보려면 지역 설명서를 확인 하십시오.
jw013

별칭을 제거하려면rename TestSR '' *
Bsienn

흠 ...- rename "\<pre\>" "" *>Unterminated <> operator at (user-supplied code).
플래시 썬더

32

쉘 매개 변수 확장 은 이와 같은 간단한 변환에 충분합니다. 명령 대체 자체와 cut/를 위해 추가 프로세스를 생성해야하기 때문에 명령 대체가 덜 효율적 sed입니다.

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

설명 : TestSR*파일을 찾고 CL${f#TestSR}새 이름이됩니다. 뒤에 #나오는 것은 파일 이름 ( f) 으로 대체됩니다 .
Joe Eifert

4

한 가지 방법이 있습니다.

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> 확장자가 .h 또는 .m 인 모든 파일 찾기
  • n=CL -> 파일 이름에 CL 접두사 추가
  • sed -e 's/^Test//' -> 파일 이름에서 테스트 접두사를 제거합니다
  • mv $a $n -> 이름 바꾸기를 수행합니다

3

당신은 시도 할 수 있습니다 :

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

자세한 내용은 man bash( "매개 변수 확장"섹션)을 참조하십시오.


1

글쎄, 나만큼 힘들지는 않았다.

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;

1
미래에 도움이 될 경우 두 패턴에 대해 명령을 반복 할 필요가 없습니다. 당신은 (예를 들어)를 사용할 수 있습니다 : for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
mrb

1

좀 더 굳은 것이 필요하다면 이것을 할 수 있습니다

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.