일괄 이름 바꾸기, 접두사 변경

일괄 이름 바꾸기, 접두사 변경

여러 파일의 접두사를 일괄적으로 바꾸는 방법은 무엇입니까?

나는 다음과 같은 많은 파일을 가지고 있습니다

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

나는 그것들을 모두로 바꾸고 싶다

  • CLConnectionContext.h
  • CLConnectionContext.m

어떻게 해야 합니까?

답변1

rename가장 쉬운 방법은 많은 Linux 배포판에서 공통적으로 사용되는 명령을 사용하는 것입니다 . 이 명령에는 두 가지 일반적인 버전이 있으므로 해당 매뉴얼 페이지에서 사용 중인 버전을 확인하세요.

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

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

TestSR*쉘 와일드카드를 사용하면 더 적은 수의 파일 이름을 전달 하고 문제가 발생할 위험을 줄일 *수 있으므로 도움이 됩니다.rename매개변수 목록이 너무 깁니다.-오류, 그리고 더 중요한 것은 로 시작하는 파일 이름이 현재 작업 디렉터리에 존재할 때 발생하는 문제를 방지하는 것입니다 . 이는 perl.command.com 기반의 특정 변종에 특히 중요합니다. rename그렇게 하지 않으면 명령 주입 취약점이 발생하기 때문입니다.

답변2

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

이는 bash 명령을 사용하여 입력 파일 이름에서 처음 6자를 제거하고 cut결과 CL앞에 추가한 후 $newname. 그런 다음 이전 이름을 새 이름으로 바꿉니다. 이는 각 파일에 대해 수행됩니다.

cut -c7-인덱스 7 이후의 문자만 입력에서 반환되도록 지정합니다. 7-인덱스 7부터 시작하여 행 끝까지의 무한 범위입니다.

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

답변3

쉘 매개변수 확장이런 간단한 변환이면 충분합니다. 명령 대체는 추가 프로세스를 생성해야 하기 때문에 효율성이 떨어집니다(명령 대체 자체 및 cut/ 의 경우 sed).

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

답변4

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

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

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

ksh93(이 구문의 원래 출처) 및 zsh에서도 작동해야 합니다.

관련 정보