![모든 파일 이름에서 아포스트로피 제거](https://linux55.com/image/22807/%EB%AA%A8%EB%93%A0%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%97%90%EC%84%9C%20%EC%95%84%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A1%9C%ED%94%BC%20%EC%A0%9C%EA%B1%B0.png)
디렉토리의 모든 파일 이름에서 아포스트로피를 제거해 보았습니다.
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
. 이 옵션이 없으면 일치하는 파일이 없으면 nullglob
glob 패턴 자체가 전달됩니다 .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
따라서 세 개의 파일( , file
및 users
)과 해당 파일을 이동할 디렉터리( )를 지정했다고 생각합니다 file
.
두 가지를 모두 올바르게 인용하면 즉각적인 문제가 해결됩니다.
$ for i in ./*; do mv "$i" "$(echo "$i" | tr -d "'")"; done