내 고객 중 하나는 학교입니다. 파일 서버에서 모든 프로젝트에는 동일한 명명 체계를 가진 디렉터리가 있습니다.
<성>, <이름> <두 번째 이름>? - <프로젝트 설명>
예를 들어:
Miller, John Andrew - 긴 프로젝트 설명 Willis, Bruce - 설명, 쉼표를 포함할 수 있음 Lewis, Mary Jane - 설명 - 빼기 기호 포함
새로운 명명 규칙은 다음과 같습니다.
<이름> <2위>? <성> - <프로젝트 설명>
예를 들어:
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 - /' *
파일 이름의 설명 부분에 -
(예: -
두 공백 사이에 a가 포함된 경우) 문제가 발생합니다.
테스트를 위해 이 플래그를 사용해야 합니다 -n
. 파일 이름은 바뀌지 않지만 해당 내용이 표시됩니다.회의완성된:
rename -n 's/([^,]*), (.*) - /$2 $1 - /' *
답변2
매칭에 관한 한, 강력한 것을 구축하려면 매우 주의해야 합니다. 예를 들어 이름과 중간 이름을 가정해 보겠습니다.
- 문자로 시작해야 합니다.
- 하이픈을 포함할 수 있습니다(단, 다른 구두점이나 공백은 포함할 수 없음).
이름 패턴은 다음과 같습니다 . 추가 비캡처 그룹 구조는 중간 이름이 비어 있을 때 캡처 그룹 번호 지정 연속성을 유지하는 데 도움이 되므로 [[:alpha:]][[:alpha:]-]*
선택적으로 공백으로 구분된 중간 이름을 만들 수 있습니다 . ((?: [[:alpha:]][[:alpha:]-]*)?)
예를 들어 Perl 기반 rename 명령을 사용하여 함께 묶습니다.
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
.