모든 파일 이름에서 아포스트로피 제거

모든 파일 이름에서 아포스트로피 제거

디렉토리의 모든 파일 이름에서 아포스트로피를 제거해 보았습니다.

for i in *; do mv $i `echo $i | tr -d "'"`; done

이 명령을 실행한 후에는 이름이 바뀌지 않습니다.

여기서 무슨 문제가 있는지 아시나요?

답변1

다음과 같이 시도해 볼 수 있습니다( bash).

shopt -s nullglob
for i in *\'* ; do mv -v "$i" "${i/\'/}" ; done

이것은 쉘 문자열 대체를 사용합니다. '포함되지 않은 파일은 실패할 수 있으므로 사용하고 싶지 않을 것입니다 mv. 이 옵션이 없으면 일치하는 파일이 없으면 nullglobglob 패턴 자체가 전달됩니다 .mv

답변2

$foo변수 대체 및 명령 대체에는 항상 큰따옴표를 사용하세요.$(foo)(해당 항목을 제외해야 하는 이유와 이를 수행할 수 있는 이유를 알지 못하는 경우)

for i in *; do mv "$i" "$(echo "$i" | tr -d "'")"; done

이는 기본적으로 작동하지만 몇 가지 제한 사항이 있습니다.

  • 파일 이름이 로 시작하면 옵션으로 해석되므로 -잘못된 동작이나 오류가 발생합니다.mv
  • 로 끝나는 이름에는 영향을 주지 않습니다 ..
  • echo일부 설정의 경우 명령에서 백슬래시가 끊어집니다 .
  • 이름 끝에 있는 줄 바꿈은 손실됩니다.

ksh93, bash 및 zsh에서는 이 구문을 사용하여 이 코드를 쉽게 작성할 수 있습니다 ${VARIABLE//PATTERN/REPLACEMENT}. --에 추가하면 . mv이 처리됩니다 -. 파일 이름이 .. 로 시작하는 경우 .*필요한 경우 뒤에 또는를 추가하세요..[^.]* ..?**

for i in *; do mv -- "$i" "${i//\'/}"; done

zsh에서는 사용할 수 있습니다zmv:

zmv '(*)' "\${1//\\'/}"

Debian, Ubuntu 및 기타 파생 제품에서 사용할 수 있습니다.rename펄 스크립트.

rename "s/'//g" *

답변3

귀하의 문제는 파일 이름에도 공백이 있다는 것입니다. 그것 없이는 오류를 재현할 수 없습니다.

$ touch "file" "user's file"
$ for i in *; do mv $i `echo $i | tr -d "'"`; done
mv: `file1' and `file1' are the same file
mv: target `file' is not a directory

따라서 실패한 이유는 두 번째 메시지입니다 target 'file' is not a directory.

for 루프에서 공백이 있는 파일을 발견하면 다음을 실행합니다.

mv user's file users file

user's따라서 세 개의 파일( , fileusers)과 해당 파일을 이동할 디렉터리( )를 지정했다고 생각합니다 file.

두 가지를 모두 올바르게 인용하면 즉각적인 문제가 해결됩니다.

$ for i in ./*; do mv "$i" "$(echo "$i" | tr -d "'")"; done

관련 정보