쉘을 사용하여 파일 이름의 단어를 교환하는 방법은 무엇입니까?

쉘을 사용하여 파일 이름의 단어를 교환하는 방법은 무엇입니까?

내 고객 중 하나가 학교입니다. 파일 서버에는 모든 프로젝트에 동일한 명명 체계를 가진 디렉터리가 있습니다.

<성>, <이름> <두 번째 이름>? - <프로젝트 설명>

예를 들어:

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

매칭에 관한 한, 견고한 것을 구축하려면 매우 주의가 필요합니다. 예를 들어 이름과 중간 이름이 있다고 가정하면

  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.

관련 정보