정규식을 사용하여 일괄 복사 및 이름 바꾸기

정규식을 사용하여 일괄 복사 및 이름 바꾸기

스크립트를 작성하지 않고도 여러 파일을 복사하고 이름을 바꿀 수 있는 방법이 있는지 궁금합니다. 이와 비슷한 이름을 가진 파일이 몇 개 있는데 prefix_12345678901_12345678901_suffix.ext복사본 이름이 다음과 같이 지정되도록 해당 파일을 모두 지정된 디렉터리에 복사해야 합니다.1234567890_1234567890.ext

또한 대상 디렉터리의 기존 파일을 덮어쓰고 싶지 않습니다.

나는 다음과 같은 일을 할 수 있다는 것을 알고 있습니다.

cp -n source/*.ext target

이어서

rename 's/.*([0-9]{11}_[0-9]{11}).*\.(.*$)/$1.$2/' *.ext

하지만 이는 먼저 파일을 복사한 다음 파일이 이미 존재하는지 확인합니다. 역과정이 필요한데..

편집하다:

좋아, 이것이 스크립트인 것 같지만 마침내 성공했습니다.

for i in /source/*.ext; do if [[ "$i" =~ [0-9]{11}_[0-9]{11} ]]; then cp $i /target/${BASH_REMATCH[0]}.ext; fi done;

답변1

pax한 번에 복사하고 이름을 바꿀 수 있습니다.

pax -rw -pp -k \
    -s'!^source/[^/]*\([0-9]\{11\}_[0-9]\{11\}\)[^/]*\(\.[^./]*\)!\1\2!' \
    -s'!.*!!' source target

pax -rw파일을 복사합니다. -pp권한을 유지하고 -k기존 파일을 덮어쓰지 않도록 합니다. 이 -s매개변수는 pax에게 복사할 때 파일 이름을 바꾸도록 지시합니다. 첫 번째 변환에서는 원하는 이름을 바꿉니다(사용기본 정규식그리고교체는 이렇게ed). 두 번째 변환은 아직 일치하지 않은 각 소스 파일 이름을 빈 문자열로 변환하여 pax에게 파일을 복사하지 않도록 지시합니다.

zsh 팬을 위한 참고 사항: 내가 아는 한, zmv다른 파일에 관계없이 정의가 존재하지 않는 파일을 복사할 수 없습니다.

관련 정보