파일 이름에 포함된 캐리지 리턴을 반복적으로 제거하는 방법

파일 이름에 포함된 캐리지 리턴을 반복적으로 제거하는 방법

수십 개의 폴더 계층에서 수천 개의 파일 이름에 추가된 캐리지 리턴 \r 문자를 반복적으로 제거하는 방법이 있습니까? 또한 모든 파일이 영향을 받는 것은 아닙니다.

예를 들어, ls 명령은 Cymbal2.wav?를 표시합니다. 여기서 ?는 \r 문자입니다.

저는 MacOS를 사용하고 있으니 이곳이 올바른 포럼이 아니라면...

답변1

변종@gils의 답변삭제모두(숨겨지지 않음) 파일 이름에 CR 문자가 나타날 때마다.

autoload -Uz zmv # best in ~/.zshrc
zmv $'(**/)(*\r*)' $'$1${2//\r}'

(이러한 파일이 있는 최상위 디렉터리에서).

$f여기서는 파일 이름만 변경하고 다른 경로 이름 구성 요소는 변경하지 않는 것이 중요하기 때문에 사용하고 싶지 않습니다 . 그렇게 하면 mv $'a\rb/c\rd' ab/cd작동하지 않기 때문입니다. 재귀적인 전역 변수를 처리하기 때문에 먼저 수행 한 mv $'a\rb/c\rd' $'a\rb/cd'다음 수행해야 합니다.mv $'a\rb' abzmv깊이 우선( (#qoD)한정자를 추가하세요).

$1위에서 $2스키마 캡처의 내용은 디렉터리 이름과 기본 이름에도 동일하게 적용된다는 점을 기억하세요.(...)$1$2

답변2

일괄 이름 바꾸기(또는 일괄 복사) 파일의 경우,zmv당신의 친구입니다.

autoload zmv
zmv -W $'**/*\r' '**/*'

설명하다:

  • zmv지정된 와일드카드 패턴(here $'**/*\r')과 일치하는 파일의 이름을 지정된 대체 표현식(here **/*)으로 바꿉니다.
  • -W옵션을 사용하면 대체 표현식에 와일드카드 문자를 사용할 수 있습니다.
  • 이것$'…'통사론\r캐리지 리턴 과 같은 백슬래시 표현식을 지원합니다 .
  • **/*현재 디렉터리의 모든 수준에 있는 모든 파일과 일치합니다 **(재귀 와일드카드.

또는:

autoload zmv
zmv $'**/*\r' $'${f%\r}'

$f원본 파일 이름을 나타냅니다.${VARIABLE%SUFFIX} 매개변수 확장form은 주어진 접미사를 제거합니다.

당신을 위해 추천 된 .zshrc:

autoload zmv
alias zcp='zmv -C'
alias zln='zln -L'

답변3

설명에 설명된 대로 이는 Linux에서는 작동하지만 기본적으로 MacOS에서는 작동하지 않습니다.

touch $'file_\r_name'

ls -l --quoting-style=c file_*
-rw-r--r-- 1 hl hauke 0 23. Nov 17:02 "file_\r_name"

find . -name $'*\r*' -exec rename -nv $'\r' '' {} + 2>/dev/null | cat -v
`./file_^M_name' -> `./file__name'

-nvrename세부 테스트 실행 모드 로 들어갑니다 .

cat -v(나중 부분이 이전 부분을 다루기 \r때문에) 출력이 이상해 보이기 때문에 (다소) 필요합니다 .\r

관련 정보