이름 바꾸기 명령 범위를 정의하고, 전체 파일 이름을 바꿉니다.

이름 바꾸기 명령 범위를 정의하고, 전체 파일 이름을 바꿉니다.

rename이 명령을 사용하여 파일 이름을 편집하고 싶습니다 . 좀 더 구체적으로 말하자면, 특정 부분을 분리해서 변경하거나, 어떤 경우에는 전체 이름을 변경하려고 합니다.

예를 들어:

세 개의 디렉터리가 있다고 가정해 보겠습니다... (test-file-1, example2, third)

"test-file-1"을 "file 1"로 변경하려면
나는 내가 사용할 수 있다는 것을 안다 rename 's/test-file-1/file 1/' *

변경할 파일 이름을 명시적으로 지정할 필요가 없도록 와일드카드를 어떻게 설정합니까?

나는 노력했다rename 's/tes*/file 1/' * 아무 소용이 없다

마찬가지로 와일드카드를 사용하여 전체 파일 이름을 변경할 수 있는지 알고 싶습니다.

나는 노력했다rename 's/^*/file 1/' test*

처리 중인 파일과 일치시키기 위해 두 번째 별표를 사용할 수 있는지는 확실하지 않지만 해당 질문에도 동일한 질문이 적용됩니다.

답변1

정규식을 올바르게 사용하지 않고 있습니다. tes*뒤에는 te임의의 수의 s가 붙는 것을 의미하므로 이름이 다음과 같이 변경됩니다.stest-file-1file 1t-file-1

$ rename -n 's/tes*/file 1/' *
test-file-1 renamed as file 1t-file-1

마찬가지로, ^*빈 문자열의 시작 항목이 일치하므로 사실상 와 비슷 ^하지만 무한 루프가 있습니다.

$ rename -n 's/^*/file 1/' *  
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE / at (eval 1) line 1.
example2 renamed as file 1example2
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE / at (eval 2) line 1.
test-file-1 renamed as file 1test-file-1
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE / at (eval 3) line 1.
third renamed as file 1third

대신에 개행 문자를 제외한 모든 문자를 일치시키려면 .*-를 사용해야 합니다 . 일반적으로 다음과 같습니다..

$ rename -n 's/tes.*/file 1/' *
test-file-1 renamed as file 1

$ rename -n 's/.*/file 1/' *      
example2 renamed as file 1
test-file-1 renamed as file 1
third renamed as file 1

물론 마지막 명령이 문제를 일으킬 것으로 예상했습니다.

관련 정보