.-.
파일 이름을 일괄적 으로 바꿔야 합니다 ..
목표: file.-.txt
지금file.txt
rename 's/.-./.' *.txt
작동하지 않습니다. 뭐가 문제 야?
답변1
Perl 버전을 사용하지 않는 이유는 Perl 버전을 사용하는 경우 rename
대체 표현식의 후행 누락으로 인해 오류가 발생하기 때문입니다.Substitution replacement not terminated at (eval 1) line 1.
/
따라서 다음 구문을 사용해야 합니다."다른"rename
rename -vn -- '.-.' '.' *.txt
이 특별한 경우에는 소스 및 대상 패턴에 쉘 glob 문자(등)이 없기 때문에 실제로 인용할 필요는 없지만 *
, 좋은 습관이므로 어쨌든 여기에서 인용했습니다.
상황에 맞는 결과를 얻었다면 -v
(verbose) 및 (no action) 중 하나 또는 둘 다를 제거하세요. 모든 항목을 로 바꾸는 옵션이 -n
추가되었습니다 . 예를 들어 대신 로 이름을 바꾸거나(계속 이름은 으로 변경됨 ) ast 항목을 바꿉니다 .-a
a
.-.
.
foo.-.bar.-.txt
foo.bar.txt
foo.bar.-.txt
file.-.-.txt
file.-.txt
-l
l
궁금해서 이 rename
명령은 s/.-./.
(예, 해당 7개 문자)를 소스 패턴으로 사용하고 *.txt
glob에서 첫 번째로 일치하는 파일 이름을 대상 패턴으로 사용합니다. 그런 다음 소스 패턴을 glob의 나머지 각 파일과 일치시키려고 시도합니다 *.txt
. 분명히 이것은 어떤 것과도 일치하지 않으며 구문 오류가 없으므로 메시지가 출력되지 않습니다.
답변2
@roaima에 동의하지만 아마도 perl
기반 변형 중 하나가 아닐 것입니다. Perl 기반 변형의 경우 구문은 다음과 같습니다.
rename 's/\.(-\.)+/./g' ./*.txt
. 로 끝나는 모든(숨겨지지 않은) 파일 이름에서 . .-.
를 모두 제거하려면 이름이 ..
.txt
-a-b.-.-.c.-.-.txt
-a-b.c.txt
s/.-././g
이는 모든 문자와 일치하고 리터럴과 일치시키기 위해 이스케이프되어야 하는 -..-.c.-.txt
정규식 연산자 로 이름이 변경됩니다 ..
.
s/\.-\././g
으로 이름이 변경됩니다 -a-b.-.c.-.txt
.
물론 중요한 ./
접두사가 있습니다. 이 접두사가 없으면 rename
.
모든 유형의 이름 바꾸기에 대해 모든 변형과의 대부분의 문제와 비호환성이 없으며 사전에 일부 온전한 검사를 수행하기 때문에 zsh
's를 선호합니다 .zmv
rename
autoload -Uz zmv
zmv '*.txt' '${f//.(-.)##/.}'
또는
zmv '(*).-(.txt)' '$1$2'
-.-
이전 것을 txt
..
답변3
무슨 일이 있었나요?rename 's/.-./.' *.txt
- s 명령이 닫히지 않았습니다.
/
뒤에 하나 추가 - roaima가 말했듯이 대시 "-"는 밑줄 "_"과 일치하지 않습니다.