여러 파일의 중간 이름을 바꾸는 방법

여러 파일의 중간 이름을 바꾸는 방법

다음과 같은 디지털 파일이 있습니다.

test01-aaa.txt
test02-bbb.txt
test03-ccc.txt
test04-ddd.txt

이름에서 aaa, bbb, ccc, ddd 부분을 제거해야 합니다. 내가 할 수 있는 최선은 무엇인가? 명령을 사용해 보았지만 'rename'어떻게 이런 식으로 사용할 수 있습니까?

rename -v "test??-*.txt" "test??.txt" *.txt

다음과 같은 파일이 있습니다.

test01.txt
test02.txt
test03.txt
test04.txt

답변1

쉘의 간단한 루프(이것은 다음과 같은 사실을 피합니다.rename이 유틸리티에는 여러 가지 충돌하는 변형이 있습니다.):

for name in test??-*.txt; do
    mv "$name" "${name%%-*}.txt"
done

이 루프는 주어진 패턴과 일치하는 현재 디렉터리의 모든 이름을 반복합니다. 이러한 각 이름에 대해 -표준 인수 대체를 사용하여 첫 번째 문자열 끝에서 문자열 끝을 자릅니다. 교체는 ${variable%%pattern}변수 값에서 일치하는 가장 긴 접미사 문자열을 제거합니다. 그런 다음 대체 결과에 접미사를 다시 추가합니다.patternvariable.txt

bash셸 에서는 nullglob일치하는 파일 이름 없이 단일 반복이 실행되지 않도록 루프를 실행하기 전에 셸 옵션을 설정해야 할 수도 있습니다.

mvGNU 시스템(또는 mvGNU coreutils가 있는 모든 시스템) 에서 개체 파일이 이미 존재하는 경우 해당 개체 파일을 사용 -b하거나 백업할 수 있습니다. --backup그렇지 않은 경우 -b위의 루프는 기존 파일을 덮어쓰는 방식으로 이름 충돌을 처리합니다.

관련 정보