이 Bash 명령이 괄호를 대체하는 정규식을 사용하지 않는 이유는 무엇입니까?

이 Bash 명령이 괄호를 대체하는 정규식을 사용하지 않는 이유는 무엇입니까?

Music디렉터리의 모든 파일과 모든 하위 디렉터리를 반복하고 파일 이름의 대괄호를 괄호로 바꾸는 이 명령이 있습니다 .

find /home/Music/ -depth -name "* *" -execdir rename 's/\[/\(/g' "{}" \;

그러나 이것은 작동하지 않습니다. 오류를 반환하지 않고 교체만 수행하지 않습니다.

나는 캐릭터를 올바르게 탈출하고 있다고 생각했습니다. 내가 어디서 잘못됐나요?

{}또한 결국 중괄호 ,를 괄호 ,로 바꾸고 싶습니다 (). 중괄호로 인해 더 복잡해지는 경우를 대비해 지금 이 내용을 언급해야겠다고 생각했습니다.

답변1

작동하지 않는 이유를 알 수 있는 유일한 이유는 이름에 공백이 있는 파일이 없기 때문입니다. "* *"이 패턴은 파일 이름에 공백이 포함된 경우에만 일치합니다.

이름에 대괄호가 포함된 파일을 찾으려면 다음을 수행하십시오.

find /home/Music/ -depth -name "*[*" -execdir rename 's/\[/\(/g' "{}" \;

답변2

renameLinux에서 이를 구현하는 두 가지 주요 방법이 있습니다.

  • 함께 제공되는 것 perl(아마도 당신이 기대했던 것)
  • util-linux와 함께 제공되는 것(아마도 가지고 있는 것).

수반되는 구문은 다음 util-linux과 같습니다.

find ... -execdir rename '[' '(' {} +

그러나 이는 한 번만 대체됩니다 [.

perl시스템에서 rename호출될 수 있습니다 prename.

대안 rename은 zsh의 입니다 zmv. 내림차순 디렉토리 깊이를 먼저 처리하고 충돌 문제를 방지합니다.

zsh에서:

autoload zmv
zmv '(**/)(* *)' '$1${2//\[/(}'

합계를 다음으로 {}변환합니다 .[]()

zmv -n '(**/)(* *)' '$1${${2//[]\}]/)}//[[{]/(}'    

답변3

다음이 작동합니다.

for i in `find o -type f`; do new="${i/\[/(}" ; if [ "${i}" != "${new}" ]; then mv ${i} ${new} ; echo "Moving ${i} to ${new}"; fi ; done

파일 이름에 공백이 포함되어 있으면 다음을 시도해 보십시오.

OLDIFS=${IFS} ; IFS=$(echo -en "\n\b") ; for i in `find o -type f`; do new="${i/\[/(}" ; if [ "${i}" != "${new}" ]; then mv ${i} ${new} ; echo "Moving ${i} to ${new}"; fi ; done; IFS=${OLDIFS}

관련 정보