이 mv 명령이 디렉토리에 쓰려고 하는 이유는 무엇입니까?

이 mv 명령이 디렉토리에 쓰려고 하는 이유는 무엇입니까?

나는 이것을 문자열을 검색하고 바꾸는 데 사용하고 있습니다.

find . -name 'xna*jpg' -exec bash -c ' mv $0 ${0/\ (2018_05_28 14_04_27 UTC)/}' {} \; 

그러면 "xna (2018_05_28 14_04_27 UTC).jpg"가 xna.jpg로 대체됩니다.

그런 다음 전체 디렉토리에 대해 이 작업을 수행할 수 있습니다. 그러나 이 오류가 발생합니다.

mv: ./xna.jpg is not a directory

그래서 그것을 하고 있지만 글을 쓰지는 않습니다. 왜 디렉토리를 고려하는지 이해가 안 되나요?

답변1

-exec bash -c ' mv $0 ${0/\ (2018_05_28 14_04_27 UTC)/}'

문제는 다음과 같습니다. 콘텐츠가 $0공백을 포함하도록 확장되어 mv두 개 이상의 매개변수가 표시됩니다.

해결책: 뭔가를 인용해 보세요:

-exec bash -c ' mv "$0" "${0/\ (2018_05_28 14_04_27 UTC)/}"'

find...또는 전혀 사용하지 마세요.

#!/bin/bash
# looks very similar, with less of the `shopt`ing, in zsh
shopt -s nullglob
shopt -s globstar
shopt -s dotglob
for original in "**/xna (2018_05_28 14_04_27 UTC)*jpg"; do
  newname="${original/\ (2018_05_28 14_04_27 UTC)/}"
  mv "${original}" "${newname}"
done

(원한다면 한 줄에 넣을 수도 있지만 여기서는 간결함보다 가독성을 선호합니다.)

관련 정보