이름 바꾸기 명령이 예상대로 작동하지 않는 이유는 무엇입니까?

이름 바꾸기 명령이 예상대로 작동하지 않는 이유는 무엇입니까?

다음과 같은 파일이 있습니다.

1_suffix.txt
2_suffix.txt
3_suffix.txt

삭제하고 싶습니다 _suffix.txt. 라는 명령을 찾아서 rename다음과 같이 사용했습니다.

먼저 다음을 시도합니다.

rename -v 's/*_suffix.txt$/\.txt/' *.png

작동하지 않았지만 다음을 시도했습니다.

rename -v 's/_suffix.txt$/\.txt/' *.png

효율적인.

두 번째 정규식이 잘못된 것 같은데 왜 작동하나요?

나는 ls를 사용해 본다:

ls _suffix.txt # not worked
ls *_suffix.txt # worked

답변1

rename명령은 전역 패턴이 아닌 정규식을 사용합니다. 유효한 전역 패턴 이지만 *foo유효한 정규 표현식은 아닙니다. *"0 이상"을 의미 하지만 0 이상도 지정해야 합니다.무엇. "모든 문자"의 경우 다음을 사용하십시오 ..

s/.*_suffix\.txt$/.txt/

이제 다음 문제는 이것이 s/_suffix.txt$/\.txt/' *.png결코 작동하지 않는다는 것입니다. rename이름이 .로 끝나는 모든 파일의 이름을 바꾸라고 지시 _suffix.txt하지만 이름이 .로 끝나는 파일에 대해서는 이 작업을 수행하도록 지시합니다 png. 이것이 *png(정규 표현식이 아닌 glob)의 의미입니다.

내 생각에 당신이 정말로 원하는 것은 다음과 같습니다.

rename 's/_suffix//' *suffix.txt

이는 아무것도 대체하지 않고 _suffix삭제하기만 하면 원하는 파일 이름이 지정됩니다.

답변2

경로명 글로브 패턴유닉스 쉘은 다른 것을 사용합니다일반적인 표현메타문자의 구문과 의미.

관련 정보