나는 이것을 문자열을 검색하고 바꾸는 데 사용하고 있습니다.
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
(원한다면 한 줄에 넣을 수도 있지만 여기서는 간결함보다 가독성을 선호합니다.)