
내 고객 중 하나가 학교입니다. 파일 서버에는 모든 프로젝트에 동일한 명명 체계를 가진 디렉터리가 있습니다.
<성>, <이름> <두 번째 이름>? - <프로젝트 설명>
예를 들어:
Miller, John Andrew - 긴 프로젝트 설명 윌리스, 브루스 - 설명(쉼표 포함) Lewis, Mary-Jane - 설명 - 마이너스 포함
새로운 명명 규칙은 다음과 같습니다.
<이름> <두 번째 이름>? <성> - <프로젝트 설명>
예를 들어:
John Andrew Miller - 긴 프로젝트 설명 브루스 윌리스(Bruce Willis) - 설명(쉼표 포함) Mary-Jane Lewis - 설명 - 마이너스 포함
이제 모든 기존 폴더의 이름을 새 규칙으로 일괄 변경하는 방법은 무엇입니까?
답변1
파일 이름의 설명 부분에는 패턴 -
(두 공백 사이의 하이픈)이 포함될 수 있으므로 이를 다음과 같은 기호로 변경할 수 있습니다.그렇지 않다설명부분에 나옵니다. 나는 선택했지만 £
그것은 순전히 임의적입니다.
rename 's/ - /£/' *
rename 's/([^,]*), ([^£]*)£/$2 $1 - /' *
s/ - /£/' tells rename to replace the first instance of
- it finds with
£ . The second command is a bit more complicated. Parenthases (
() ) are used to group selections together -- so everything that matches the pattern within the first set of parens can be called later as
$1 (all the way up to
$9 ).
[^,] means 'any character, except for
,';
means 'zero or more of the previous character';
[^,]`는 '쉼표를 제외한 모든 문자가 0개 이상'이라는 의미입니다. 이름 바꾸기는 기본적으로 탐욕적이므로 가능한 가장 긴 문자열과 일치합니다.
나머지는 꽤 자연스럽게 따라오는 것 같아요.
파일 이름에 기호가 나타나는지 확실하지 않은 경우 다음을 실행하세요.
printf '%s\n' *£*
Perl-rename이 있는 경우:
rename 's/([^,]*), (.*) - /$2 $1 - /' *
파일 이름의 설명 부분에 -
(즉, -
두 공백 사이에) 포함되면 중단됩니다.
-n
파일 이름을 바꾸지는 않지만 파일 이름이 무엇인지 표시하는 플래그 로 이를 테스트해야 합니다.~일 것이다수행한 작업:
rename -n 's/([^,]*), (.*) - /$2 $1 - /' *
답변2
매칭에 관한 한, 견고한 것을 구축하려면 매우 주의가 필요합니다. 예를 들어 이름과 중간 이름이 있다고 가정하면
- 문자로 시작해야 합니다
- 하이픈을 포함할 수 있습니다(그러나 다른 구두점이나 공백은 포함할 수 없음).
귀하의 이름 패턴은 다음과 같습니다 [[:alpha:]][[:alpha:]-]*
. 그런 다음 ((?: [[:alpha:]][[:alpha:]-]*)?)
추가 비캡처 그룹 구조가 중간 이름이 비어 있을 때 캡처 그룹 번호를 똑바로 유지하는 데 도움이 되므로 선택적 공백으로 구분된 중간 이름을 만들 수 있습니다 . 예를 들어 Perl 기반 이름 바꾸기 명령을 사용하여 함께 사용
rename -nv -- 's/(^[^,]*), ([[:alpha:]][[:alpha:]-]*)((?: [[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
또는 (단일 공백 대신 필드 사이에 보다 일반적인 공백 허용)
rename -nv -- 's/(^[^,]*),\s+([[:alpha:]][[:alpha:]-]*)((?:\s+[[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
스위치 -n
는 작동하지 않습니다. 즉, 제거될 때까지 실제로 이름 바꾸기를 수행하지 않습니다. Perl 기반 이름 바꾸기가 없으면 perl
및 의 조합을 사용할 수 있습니다 mv
.