perl
이 도구는 일상 작업에서 매우 귀중한 동반자가 되었지만 rename
작업을 더 어렵게 만드는 몇 가지 단점이 여전히 있습니다. 특히 파일이 있는 경우에는 더욱 그렇습니다.아니요현재 작업 디렉토리에 있습니다.
송장이 많고 customer1의 모든 송장이 하나의 계정에 할당되어 있다는 것을 알고 있다고 가정합니다. 따라서 향후 스크립팅을 더 쉽게 만들기 위해 assi_
앞에 "할당됨"을 추가하고 싶습니다 .
예를 들어:
/home/user/bizz/invoices $ ls -1 t1/inv*
t1/inv_customer1_20130506.txt
t1/inv_customer1_20130823.txt
t1/inv_customer1_20130930.txt
t1/inv_customer2_20131207.txt
t1/inv_customer2_20131113.txt
이제 무슨 일이 일어나는지 살펴보세요.
/home/user/bizz/invoices $ rename 's/^/assi_/' t1/inv_customer1*
Can't rename t1/inv_customer1_20130506.txt assi_t1/inv_customer1_20130506.txt: No such file or directory
(etc.)
헤헤. rename
이미 선택됨전체 경로assi_
파일뿐만 아니라 파일에 추가하기 전에 사용됩니다 . 그러니 내가 못찾는게 당연하지inv_customer1_20130506.txt존재하지 않는목차"assi_t1".
rename
그렇다면 파일 이름에만 정규식을 적용하도록 가르칠 수 있는 방법은 무엇일까요 ?
참고:
1. 항상 하위 디렉토리로 이동하고 싶지는 않습니다 cd
. 2.
가능하다면 루프 사용도 피하겠습니다 find
.
답변1
rename
디렉터리 간에 파일을 이동할 수 있기 때문에 이런 방식으로 작동합니다. 와 마찬가지로 mv
마지막 구성 요소뿐만 아니라 전체 경로에서 작동합니다.
마지막 구성요소만 수정하려는 경우 정규 표현식을 에 고정 하고 일치하는 항목이 없고 마지막 구성요소에만 (\A|?<=/)
일치하는지 확인할 수 있습니다 ./
/
rename 's~(\A|?<=/)(?=[^/]*)\z~assi_~' t1/inv_customer1*
또 다른 방법은 파일 이름을 먼저 분할하는 것입니다.
rename 's~(.*/)~~s; my $d = $1; s/\A/assi_/; $_ = "$d$_"' t1/inv_customer1*
이 모듈을 사용할 수도 있습니다 File::Spec
. 이는 Unix가 아닌 경로를 처리하는 이점이 있습니다.
rename 'use File::Spec::Functions; my ($v,$d,$f) = splitpath($_); $f =~ s/\A/assi_/; $_ = catpath($v,$d,$f)' t1/inv_customer1*