스크립트를 작성하지 않고도 여러 파일을 복사하고 이름을 바꿀 수 있는 방법이 있는지 궁금합니다. 이와 비슷한 이름을 가진 파일이 몇 개 있는데 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
다른 파일에 관계없이 정의가 존재하지 않는 파일을 복사할 수 없습니다.