이름 바꾸기를 사용하여 여러 파일의 이름 바꾸기

이름 바꾸기를 사용하여 여러 파일의 이름 바꾸기

파일 이름을 일괄적으로 변경해야 합니다. 제가 살펴본 다른 질문으로는 문제가 제대로 해결되지 않았습니다. 내 파일 이름은 결정적으로 생성되므로 이름이 어떻게 지정될지 예측할 수 없습니다. 나는 그것이 NORMAL로 시작하고 끝날 것이라는 것을 알고 있습니다 -lib*. 그 사이의 모든 것을 string 으로 바꾸고 싶습니다 X. 예를 들어,

|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.concordant
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.deletion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.divergent
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.inversion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib1.translocation
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.concordant
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.deletion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.divergent
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion
|   |   |-- NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translocation

그래서 이런 형태가 될 수도 있겠지만 rename "s/something/X/", 정규식을 어떻게 사용하는지 모르기 때문에 어떤 형태로 되어야 할지 모르겠습니다.

답변1

유용한 Perl 드라이버가 rename모든 배포판에서 항상 사용 가능한 것은 아닙니다. 예를 들어 Fedora와 CentOS(그리고 아마도 RedHat)는 기본 rename유틸리티를 사용하여 기본 검색 및 바꾸기만 수행합니다.

운이 좋지 않아 이들 중 하나를 사용할 수 없는 경우 다음과 같은 방법이 도움이 될 수 있습니다.

for oldname in *; do
    newname=$(echo "$oldname" | sed -e 's/\(NORMAL\).*\(-lib.*\)/\1X\2/')
    mv "$oldname" "$newname"
done

답변2

rename운이 좋게도 액세스할 수 있다면 다음 사항으로 충분할 것입니다.

rename 's/(NORMAL).*(-lib)/$1X$2/' *

답변3

Debian 및 그 파생 프로그램 rename(Ubuntu, Mint 등)에 있는 스크립트는 첫 번째 인수가 이전 이름을 새 이름으로 변환하는 Perl 표현식인 Perl 스크립트입니다. 이 스크립트를 사용하면 다음을 수행할 수 있습니다.

rename 's/.*-lib/NORMAL_X-lib/' NORMAL_*-lib*

이것s운영자실행하다정규식대안. 인터넷에는 다음과 같은 많은 정규식 튜토리얼이 있습니다.1. .*-lib마지막으로 나타날 때까지 문자열을 일치시키므로 -lib( .*모든 문자열과 일치) s/.*-lib/NORMAL_X-lib/해당 부분 NORMAL_blahblah-libNORMAL_X-lib.

Linux 배포판이 Debian에서 파생되지 않은 경우 이 rename유틸리티는 실제 작업을 수행하는 데 거의 적합하지 않습니다. 대신 쉘 루프를 사용할 수 있습니다.

for x in NORMAL_*-lib*; do
  mv "$x" "NORMAL_X-lib${x##*-lib}"
done

${x##*-lib}이는 변수 값에서 x마지막 항목을 뺀 값입니다 -lib. 이것은 표준이다매개변수 확장통사론.

이 작업은 zsh에서 가장 쉽습니다.zmv기능. autoload -U zmv자신의 것을 입력 .zshrc하거나 명령줄에서 한 번 실행한 다음 실행하십시오.

zmv 'NORMAL_*-(lib*)' 'NORMAL_X-$1'

답변4

당신은 사용을 고려할 수 있습니다주위를 둘러보세요, (?<=NORMAL).*?(?=-lib)

$ rename -v -n -- 's/(?<=NORMAL).*?(?=-lib)/X/' *
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.insertion renamed as NORMALX-lib4.insertion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.inversion renamed as NORMALX-lib4.inversion
NORMAL_H_LS-A7-A0CE-10A-01D-A017-09-lib4.translation renamed as NORMALX-lib4.translation

관련 정보