여러 파일의 접두사를 일괄적으로 바꾸는 방법은 무엇입니까?
나는 다음과 같은 많은 파일을 가지고 있습니다
- 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에서도 작동해야 합니다.