我正在使用这个搜索和替换字符串;
find . -name 'xna*jpg' -exec bash -c ' mv $0 ${0/\ (2018_05_28 14_04_27 UTC)/}' {} \;
这样它将用 xna.jpg 替换“xna (2018_05_28 14_04_27 UTC).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
(如果你愿意的话,你也可以把它放在一行上,但我在这里更看重可读性而不是紧凑性。)