**rename** 명령을 사용하지 않고 파일 이름 바꾸기

**rename** 명령을 사용하지 않고 파일 이름 바꾸기

파일 디렉토리가 있습니다.

Measurements Panama 2009-03-22 Session1.xml
Measurements Panama 2009-03-22 Session2.xml
Measurements Panama 2009-03-22 Session3.xml
Measurements Panama 2009-03-22 Session4.xml
...
Measurements Panama 2009-03-22 Session10.xml

공백과 대시 문자를 제거하고 싶습니다 -. 나는 사용하고 싶지 않다이름을 바꿔라Perl이나 정규식을 모르기 때문에 명령을 사용합니다. 파일 이름의 일부를 제거하기 위한 또 다른 기사의 제안은 다음과 같습니다:

for f in *.png; do mv $f ${f#image}; done

좋아 보인다. 그 문자가 무엇을 하는지 알 수 없습니다 #(파일 이름에서 "image"라는 문자열을 제거한다고 가정합니까?). 어쨌든 공백과 대시를 제거하려면 어떻게 해야 합니까?

해당 파일이 디렉터리가 아니라고 실행하면 오류가 발생합니다.

[jings]s0128943: for f in *.xml; do mv $f ${f//[ -]/};done

mv: target `MeasurementsPanama20090322Session10.xml' is not a directory

mv: target `MeasurementsPanama20090322Session1.xml' is not a directory

모든 파일을 기다립니다.

답변1

쉘의 매뉴얼 페이지에서 ${...}대체 정보를 찾을 수 있습니다.큰 타격(1). 가장 흔한:

  • ${var#word}var가장 짧은 접두사 제거: word접두사가 있는 변수 값(있는 경우)을 제거합니다.

  • ${var%word}var가장 짧은 접미사 제거: 접미사의 변수 값 word(있는 경우)을 제거합니다.

  • ${var/pattern/replacement}첫 번째 패턴 제거

  • ${var//pattern/replacment}패턴의 모든 항목을 제거합니다.

따라서 귀하의 예에서는 ${f#image}(예를 들어) 값으로 확장하고 접두사를 제거하여 값을 생성합니다.fimage01.pngimage01.png

확장의 및 부분 word은 파일 이름과 동일한 와일드카드 확장을 갖습니다. 따라서 공백 및 를 제거하려면 (를 사용하여 모든 문자 및 빈 문자열을 바꿀 수 있습니다.replacement${...}-${f//[ -]/}-

맨 페이지의 모든 세부 사항.

답변2

Perl이 있는 경우 rename(예: Debian 또는 Ubuntu를 사용하기 때문에) 이것이 이 특정 고양이를 스킨하는 가장 쉬운 방법입니다(별도의 고양이에서와 같이 대규모 이름 변경 및 사이트 아카이브 검색을 위한 많은 도구가 있습니다).뿌리주요 항목을 모두 찾아야 합니다.)

rename 's/[- ]//g' *.xml

즉, 가장 중요한 쉘 프로그래밍 원칙을 따르면 스크립트가 작동할 것입니다.모든 변수 대체는 큰따옴표로 묶어야 합니다.. (이러한 추가 구문 오류가 필요한 이유는 무엇입니까? 어떤 경우에는 실제로 인용되지 않은 동작을 원하기 때문입니다. 그러나 이러한 경우는 매우 드뭅니다.)

for f in *.xml; do mv "$f" "${f//[ -]/}"; done

zsh를 사용하면 루프를 작성할 필요가 없습니다. 편의 zmv기능을 사용할 수 있습니다.

autoload zmv
zmv '(*.xml)' '${1//[- ]/}'

답변3

sed를 사용하여 새 이름을 만들 수도 있습니다. 있을 것이다

for i in *.xml; do mv "$i" `echo "$i" | sed -e "s/[ -]//g"`; done

관련 정보