Music
디렉터리의 모든 파일과 모든 하위 디렉터리를 반복하고 파일 이름의 대괄호를 괄호로 바꾸는 이 명령이 있습니다 .
find /home/Music/ -depth -name "* *" -execdir rename 's/\[/\(/g' "{}" \;
그러나 이것은 작동하지 않습니다. 오류를 반환하지 않고 교체만 수행하지 않습니다.
나는 캐릭터를 올바르게 탈출하고 있다고 생각했습니다. 내가 어디서 잘못됐나요?
{}
또한 결국 중괄호 ,를 괄호 ,로 바꾸고 싶습니다 ()
. 중괄호로 인해 더 복잡해지는 경우를 대비해 지금 이 내용을 언급해야겠다고 생각했습니다.
답변1
작동하지 않는 이유를 알 수 있는 유일한 이유는 이름에 공백이 있는 파일이 없기 때문입니다. "* *"
이 패턴은 파일 이름에 공백이 포함된 경우에만 일치합니다.
이름에 대괄호가 포함된 파일을 찾으려면 다음을 수행하십시오.
find /home/Music/ -depth -name "*[*" -execdir rename 's/\[/\(/g' "{}" \;
답변2
rename
Linux에서 이를 구현하는 두 가지 주요 방법이 있습니다.
- 함께 제공되는 것
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}